如果这是FP中的一个基本问题,请原谅.让我们考虑一下可选的Monad.我知道我可以根据一个函数使用mapOptional转换为另一个Optional(如果Optional具有值,则会调用该函数).但是,如果我的函数有两个输入,而不是一个输入呢?

例如:

var data = Optional.of(100);
var result = data.map(x -> x * 2); //all good!

但是,

int getData(Connection conn, int data) { ... }

var data = Optional.of(100);
var connection = getOptionalDataConnection();
var result = data.map(i -> getData(connection?, i));  //this does not work as the getData function only accepts non-optionals

我相信在FP世界中有一个术语,我只是不熟悉它,但我有一个map函数,它接受"两个"输入,而不是一个.我想要一个助手/实用程序/...如果两个输入都在的话,它会调用我的函数.但如果其中任何一个是"空",应该返回Optional.empty().

它叫什么?Java支持它吗?

推荐答案

它叫什么?Java支持它吗?

这被称为monad,是的,Java通过flatMap function(monadic bind)支持它.这里演示了两个可选整数:

var xo = Optional.of(100);
var yo = Optional.of(2);
var result = xo.flatMap(x -> yo.map(y -> x * y));

在本例中,result是保持整数200Optional值.

对于OP中的特定示例,您实际上不需要Monad,因为使用Maybe/Optional applicative functor的功能就足够了.然而,我不太熟悉Java生态系统,我在API文档中看不到任何类似apply的方法.您可能会自己编写它,但我从Java的表亲语言C#获得的经验告诉我,应用函数器在这种语言中很笨拙.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

为什么Java的代码工作(if condition内部的实例)

通过合并Akka Streams中的多个慢源保持订购

所有 case 一起输入时输出错误,而单独放置时输出正确

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

将不受支持的时区UT重写为UTC是否节省?

Spring Boot Maven包

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

Log4j与jdk21兼容吗?

Java连接池无法正常工作

从Spring6中的JPMS模块读取类时出现问题

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

除0错误/抱歉我的句子是PT

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

在Java中将对象&转换为&q;HashMap(&Q)

由于版本不匹配,从Java 8迁移到Java 17和Spring 6 JUnit4失败

简化每个元素本身都是 map 列表的列表

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?