当前位置: 首页 > 面试题库 >

番石榴中有什么类似于功能Java的效果吗?

彭华皓
2023-03-14
问题内容

我知道纯函数式编程的目标之一就是消除可变性,从而消除副作用。但是,让我们面对现实吧,即使存在所有功能编程库,Java也不是一种功能语言。实际上,似乎某些FP图书馆知道并期望这样做。例如在Functional
Java中,就有Effect类。在Jedi
FP库中,有Command接口。除其他事项外,这使您可以将类型安全的命令模式应用于Iterable没有讨厌的for循环样板的元素

Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
    public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );

所以问题是,番石榴中是否有类似的东西?

接受澄清后进行编辑

在某种情况下,我正在开发一个框架来帮助解决大多数Java
FP库固有的“垂直问题”。所以,我
竟让如上图所示的代码示例:即明确宣布一个新的类实现Command其所有的垂直噪声过甜的烦躁,只需在声明之后立即应用它的目的。

我一直在考虑实际的命令模式,在这里可能在其他地方声明了几个可能的命令,只有其中一个被传递到要迭代应用的代码中。此外,我的框架的目标是使创建功能接口对象(函数,谓词,命令,其他简单的lambda)更加惯用,而无需简单地将垂直问题转移到其他地方。我早就意识到这不在番石榴的范围之内。但是,由于其他FP库中提供了类似Command的界面,所以我只是想知道Guava中是否存在类似物。

使用我的框架的一个更完整的代码示例可能是这样的:

class Stuff {
    private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
    public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
    public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());

    // methods exist for use elsewhere, but are conveniently also wrapped as commands
    public void someMethod1() {...}
    public void someMethod2() {...}
}

class Activity {
    public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
        doSomeThings();
        ...
        forEach(stuffs, doCmd);
        ...
        doOtherThings();
    }
}

问题答案:

不!

Guava项目负责人Kevin Bourrillion谈到了Guava的功能特点:

“语法很烂。同时,直到适当的语言变化出现之前,这些东西现在一直而且永远都是什么,只是权宜之计,这时我们终于可以真正决定最佳语法并开始使用函数式编程实际上一次使Java变得更好。因此,我不确定要在功能/谓词中投入多少精力;它在图书馆中的原因更多是因为它必须存在,而不是因为我们认为它是皇冠上的明珠。”

当Java 8出现时,我们可能会极大地改变我们的策略,但是暂时不会。

此外,我们还没有发现很多用例,我们认为Command您所描述的接口将是最佳解决方案。例如,我们认为您的上述代码最好写成

for(PhoneNumber phone : phoneList) {
  phone.call();
}

老式的方式。我们可能会相信的优点Command,但我认为“逐个使用”用例几乎总是比老式方法更好。



 类似资料:
  • 我对番石榴很陌生(说实话,我不是“很新”,我是这个主题的新手),所以我决定浏览一些文档,在阅读本文时感到非常惊讶: 我不明白这个方法的意义。这意味着,与其这样做,不如: (如果myObject为null,这可能会导致) 我应该用 如果为空,这将抛出一个,如果它不是空,则返回。 我很困惑,这可能是有史以来最愚蠢的问题,但是... 这有什么意义?这两条线和我能想到的任何情况下的结果是完全一样的。 我甚

  • 问题内容: 有没有理由 但不是 ? 如何正确过滤列表?我可以用 当然可以,但是如果我理解正确的话,就不能保证我的订购顺序保持不变。 问题答案: 它之所以未实现,是因为它会在返回的List视图上暴露大量危险的慢速方法,例如#get(index)(会引发性能错误)。ListIterator也很难实现(尽管我几年前提交了一个补丁来解决)。 由于索引方法在过滤后的列表视图中效率不高,因此最好使用不包含它们

  • 问题内容: 我是番石榴的新手(老实说,我不是“新手”,我是这个主题的新手),所以我决定阅读一些文档,并在阅读本文时感到非常惊讶: 我不明白这种方法的意义。这意味着不要这样做: (如果myObject为null ,则可能会导致) 我应该用 这 将 抛出如果是空和返回,如果它不为空。 我很困惑,这可能是有史以来最愚蠢的问题,但是… 这有什么意义呢?在我能想到的任何情况下,这两行所做的事情与结果完全一样

  • 问题内容: Apache Commons IO 有一个很好的便捷方法IOUtils.toString()来读取字符串。 由于我正尝试从Apache Commons转移到Guava:Guava中有与之等效的产品吗?我查看了包中的所有类,但几乎找不到任何简单的东西。 编辑: 我理解并赞赏字符集的问题。碰巧,我知道我所有的来源都是ASCII(是,ASCII,不是ANSI等),因此在这种情况下,编码对我来

  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 问题内容: 我想知道哪个更有效,为什么? 1) 要么 2) 问题答案: 我看不出您为什么要在此处使用builder的任何原因: 比在这种情况下制作一个更具可读性, 不会推断通用类型,并且在用作单行代码时必须自己指定类型, (来自docs) 在与另一个不可变集合调用时 做得很好( 尝试避免在安全的情况下实际复制数据 ), (从源) 调用以前创建的,同时避免为零元素和一元素集合创建任何列表(分别返回空