gpt4 book ai didi

java - Guava 中有什么类似于 Functional Java 的 Effect 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:46 25 4
gpt4 key购买 nike

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但让我们面对现实吧,即使存在所有的函数式编程库,Java 也不是一种函数式语言。事实上,一些 FP 库似乎知道并期望这一点。例如在 Functional Java 中,有 Effect类(class)。在 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 );

那么问题来了,Guava 中有类似的东西吗?

在接受澄清后编辑

我正在开发 framework在某些情况下,这有助于解决大多数 Java FP 库中固有的“垂直问题”。因此,我不会实际制作如上所示的代码示例:即,显式声明 Command 的新类实现及其所有垂直噪音令人作呕的特性,仅用于声明后立即应用的目的。

我考虑的更多是实际的命令模式,其中可能有多个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是使创建功能接口(interface)对象(函数、谓词、命令和其他简单的 lambda)更加地道,而无需简单地将垂直问题转移到其他地方。我早就意识到这不在Guava的范围内。但是由于其他 FP 库中提供了类似命令的界面,所以我只想知道 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 的功能特点:

“The syntax sucks. At the same time, this stuff is now, has always been and will always be nothing but a stopgap measure until the right language change can come along, at which time we can finally really decide on the optimal syntax and have functional-style programming start actually making lives better in Java for once. So I’m undecided how much effort to put into the Function/Predicate stuff; it’s in the library more because it sort of had to be, not so much because we think it’s a crown jewel.”

当 Java 8 出现时,我们可能会显着改变我们的策略,但这不会持续一段时间。

此外,我们还没有发现很多我们认为您描述的 Command 接口(interface)是最佳解决方案的用例。例如,我们认为您上面的代码写成这样会好得多

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

老办法。我们可能会相信 Command 的优点,但我认为“for-each”用例几乎总是以老式方式更好地完成。

关于java - Guava 中有什么类似于 Functional Java 的 Effect 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com