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

Ale*_*Mal 4 java lambda optional consumer java-8

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);

}

}
Run Code Online (Sandbox Code Playgroud)

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

有人能帮我吗?

Grz*_*rek 5

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

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

ts1.opt1
  .map(x -> x + 3).orElseThrow(...)
Run Code Online (Sandbox Code Playgroud)

get()Optional实例上使用时要记住要小心.在你决定使用它,看看orElse,orElseGetorElseThrow.

  • 请注意,在Java 9中不会弃用`Optional.get`,但是使用它时要小心的建议是好的. (3认同)
  • 该方法名为`orElseThrow`.关于`get()`,你也可以说`orElseThrow`"实质上将`NullPointerException`转换为``WhatEverYouWantException`.所以你必须编写`orElseThrow(NoSuchElementException :: new)`来摆脱将来的"弃用"警告.无论如何,我总是使用`orElseThrow(NullPointerException :: new)`这是一件好事...... (2认同)