Guava 中有类似 Function Java 的 Effect 的东西吗?

2023-11-26

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

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

在接受澄清答案后进行编辑

我正在开发一个框架在某些情况下,这有助于解决大多数 Java FP 库固有的“垂直问题”。所以我会not实际上使代码示例如上所示:即显式声明一个新的类实现Command及其所有令人讨厌的垂直噪声,只是为了在声明后立即应用它。

我更多地考虑了实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是使创建函数接口对象(函数、谓词、命令、其他简单的 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();
    }
}

Nope!

Guava 项目负责人 Kevin Bourrillion 曾这样评价 Guava 的功能特点:

“语法很糟糕。与此同时,这些东西现在、过去、将来都只是权宜之计,直到出现正确的语言变化,那时我们才能最终真正决定最佳语法并开始函数式编程实际上这一次让 Java 的生活变得更好了。所以我不确定要在函数/谓词方面投入多少精力;它更多地被放在图书馆里,因为它有点必须存在,而不是因为我们认为它是皇冠上的宝石。”

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava 中有类似 Function Java 的 Effect 的东西吗? 的相关文章

随机推荐

  • Mac OS 下有没有办法将数据发送到另一个进程的标准输入?

    我想知道是否有一个 API 无论它多么晦涩难懂 它都允许某人将数据发送到另一个进程的stdin在Mac OS X下流 在Linux下 如果我没记错的话 你可以使用文件系统 proc访问这些流 当然需要正确的权限 我不知道 马赫端口 有人吗
  • 获取代码片段中的命名空间

    微软链接here列出了我们可以使用的三种方法 但是我们如何获取当前的命名空间呢 我看到有一个类似的问题 但答案是使用宏 它不能解决这个特定问题 NameSpace 可以执行以下操作
  • 浏览器刷新时随机全屏背景图像

    我使用我在网上找到的这个脚本 每当刷新浏览器时就会有一个随机背景图像 CSS body background no repeat center center fixed webkit background size cover moz ba
  • 嵌套属性可以与继承结合使用吗?

    我有以下课程 Project Person Person gt 开发商 Person gt Manager In the Project模型我添加了以下语句 has and belongs to many people accepts ne
  • 在 Typescript 中,如何区分 Node 和普通 Javascript 错误类型?

    我有以下功能 Retrieves a component template from filesystem const getComponentTemplate async p string Promise
  • 在javascript中将对象移向一点[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我为此在数学上苦苦挣扎 我需要将一个物体均匀地移向一个点 我在 x 500 y 250 处有一个点 在 0 0 处有一个对象 如果移动速度为 1 我将如何计算出要获得该点 我需要以
  • 如何按 POJO 属性降序对列表进行排序?

    我有这样的 POJO 类学生 class Student private int score private String FirstName Getters and setters 我正在像这样创建 ArrayList public st
  • 在富文本框中创建换行符

    我需要帮助为 RichTextBox 创建新行 但在使用 CheckBox 时我无法使用它 它保持重叠而不是创建新的单词行 尝试使用的方法rtbdisplay text display envrionment newline 我的代码中的示
  • 如何在Java中显示树形层次结构?

    我的数据库中有一个名为 Process 的表 该进程表有3个字段 进程号 进程名 进程父进程id 现在我想以图形格式显示这个父子层次结构 那么您能否向我提出以下建议 Q1 为了从数据库获取数据并将数据存储在该数据结构中 哪种数据结构更好 Q
  • 如何在 IE 中使用 JQuery 隐藏和显示 SELECT 选项

    我试图从下拉列表中隐藏一些选项 jQuery 的 hide and show 在 Firefox 和 Chrome 中工作得很好 但在 IE 中就不那么幸运了 有什么好主意吗 根据浏览器检测隐藏和显示选项 在许多可能的方法中 此方法需要浏览
  • Mysql 表名不能大写

    我需要更改 mysql 接受大写和小写表名 select from users 上面的查询工作正常 但下面的查询不起作用 select from USERS 这取决于您的系统 主要值是 Unix Windows 和 Mac OS 您需要将系
  • firebase 消息服务可以 android:exported="false" 吗?

    想确认是否可以设置android exported false 例如 ID 服务和消息服务 我通过保持测试android exported false 和通知工作正常
  • param: _* 在 Scala 中意味着什么?

    作为 Scala 2 9 1 的新手 我有一个List Event 并想将其复制到Queue Event 但以下语法会产生Queue List Event 反而 val eventQueue Queue events 由于某种原因 以下工作
  • 了解 iBeacon 数据:功率字段和其他字节

    我是蓝牙系统的新手 我正在尝试了解新的苹果技术 iBeacon 使用的数据 已经有一些很好的答案解释了它是如何工作的 我一直在阅读我能找到的所有内容 特别是蓝牙规范 尽管如此 我仍然遗漏了一些要点 我将首先举一个例子 我正在使用设置广告数据
  • 如何在linux中使用cx_freeze创建要在windows中使用的包

    如何在 Linux 中使用 cx freeze 创建一个可在 Windows 中使用的包 如 exe 或 bin 文件 我在 Linux 中测试了 cx freeze 但在 Linux 和 Windows 中制作软件包是未知的 例如 cxf
  • 将 VB.NET Winforms 应用程序移植到 C#

    是否有任何 好的 资源可将 VB NET winforms 应用程序移植到 C 我确信有软件可以翻译代码 但我希望同时重构代码 保持当前的形式是有问题的 因为它使用了 VB NET 允许的一些 不良设计 实践 并且会使未来的维护进一步复杂化
  • 如果 chrome 开发工具打开,AJAX 可以工作,但如果 chrome web 工具关闭,AJAX 就不行?

    我正在通过 ajax 加载 json 文件 如果 Chrome 开发工具打开 一切都会完美运行 如果 Chrome 开发工具关闭 则会失败 值得庆幸的是 即使关闭时 开发工具仍然会继续做它的事情 所以我仍然可以看到我得到的异常 Failed
  • C#:枚举中的按位运算符(MVC 中的自定义授权)

    我目前正在阅读一篇文章 但我不太明白这是如何与逻辑运算符一起使用的 谁能向我解释一下吗 例如 如果我想与客户 员工 主管和管理员建立 4 级证券 Serializable Flags public enum WebRoles custome
  • UnsatisfiedLinkError:java.library.path中没有opencv_java249

    在我的 Mac 上运行一段代码时遇到一些问题 有人给我写了一个图像分析 java 应用程序 但当我尝试在 netbeans 上运行它时 我不断收到此错误 运行 线程 主 java lang UnsatisfiedLinkError 中出现异
  • Guava 中有类似 Function Java 的 Effect 的东西吗?

    我知道纯函数式编程的目标之一是消除可变性 从而排除副作用 但让我们面对现实吧 即使存在所有函数式编程库 Java 也不是一种函数式语言 事实上 一些 FP 图书馆似乎知道并期望这一点 例如 在函数式 Java 中 有Effect班级 在 J