java - 为什么Java的Optional在ifPresent()中不调用Consumer?

标签 java lambda java-8 option-type consumer

public class TestSupplier {

Optional<Integer> opt1;

public static void main(String[] args) {
    // TODO Auto-generated method stub

    TestSupplier ts1 = new TestSupplier();

    ts1.opt1 = ts1.average(100,20,30,80);
    Consumer<Integer> cns1 = (x) -> x += 3;
    ts1.opt1.ifPresent(cns1);
    System.out.println(ts1.opt1.get());

}


private Optional<Integer> average(int... n1) {
    if (n1.length == 0) return Optional.empty();
    int sum = 0;
    for(int score: n1) sum += score; 
    return Optional.of(sum/n1.length);

}

}

当我运行代码时,结果是 57(这是平均 100、20、30、80 的正确结果),但我创建了一个应该将结果递增 3 的消费者...但它似乎不起作用。

有人可以帮助我吗?

最佳答案

Consumer 操作实际上正在运行,但您提供的主体仅修改了最终丢失的本地实例。 ifPresent() 方法应该只用于执行副作用(操作)。

如果要对 Optional 实例持有的值执行计算,请改用 map()

ts1.opt1
  .map(x -> x + 3).orElseThrow(...)

Optional 实例上使用 get() 时请务必小心。在决定使用它之前,请查看 orElseorElseGetorElseThrow

关于java - 为什么Java的Optional在ifPresent()中不调用Consumer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419458/

相关文章:

c# - 为什么不能在 Visual Studio 2013 的条件断点中使用 lambda?

Java 8 流 IllegalStateException

java - 按流排序不适用

java - 将 Scala Future 转化为 CompletableFuture

java - 使用 ActionBar 导航返回上一个 Activity

c++ - 如何为 parallel_invoke 设置进度条?

c++ - 设置为 std::function 的目标丢失

java - 如何在spring test中动态设置环境变量

java - 如何在logback.xml中添加小于(<)和大于(>)

java - 将值(例如 id)从一个 servlet 发送到另一个(jsp+servlet+mysql)