Optional#map 可以将输入参数的状态更改为 Function lambda 吗?

And*_*all 2 java monads java-8 option-type

我有一段Java代码,它从Optional#map的输入参数中包含的集合中删除一个元素

boolean ret = methodReturnsOptioanl()
                .map(project -> project.getDocIds().remove(docId))
                .orElse(false);
Run Code Online (Sandbox Code Playgroud)

其中project.getDocIds()返回一组字符串id并保证不为空。

我已经测试过并且可以工作;如果Optional为空或者集合中不存在docId,ret为false。

但是,Optional#map 可以执行此操作并更改成员集的状态并返回 Set#remove 操作的布尔结果吗?

我四处搜寻,找不到任何明确的答案。

eri*_*son 5

map()这种方式可以吗?不,因为map()表达了将可选元素转换为新类型的意图,而这不是您正在做的事情。

虽然不要求操作map()没有副作用,并且您的原始代码将执行您想要的操作,但它并没有执行人们期望的操作map()。未来的读者可能需要再看一遍才能了解您的代码在做什么。我会建议一些更明显的东西:

var project = methodReturnsOptional();
boolean ret = project.isPresent() && project.get().getDocIds().remove(docId);
Run Code Online (Sandbox Code Playgroud)