java Optional的惰性求值

qoefvg9y  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(93)

是否可以有一个java.util.Optional,仅在需要时才进行评估?
我需要将一个Optional传递给一个方法(属于一个我无法更改的API),这个方法可能会也可能不会使用那个Optional的值。因为这个值是通过一个繁重的操作计算出来的,所以我希望只在需要的时候才计算那个值,例如调用get()orElseGet()ifPresent()等。
比如Optional.ofLazy(Supplier<T> computeValue)

relj7zay

relj7zay1#

你需要的是一个Supplier,它返回一个OptionalSupplier是懒惰的部分。
概念代码:

Foo heavyComputation() { ... }

void main() {
    Supplier<Optional<Foo>> sup = () -> heavyComputation();
    doSomethingWhichMayNeedHeavyResult(sup);
}

void doSomethingWhichMayNeedHeavyResult(Supplier<Optional<Foo>> sup) {
    if (electricityIsTooCheap) {
       Foo foo = sup.get().get().orElse(null); // This will lazy load.
    }
}

为了简洁起见,我也想有一些东西,结合成一个,但这将是以后我猜。

gorkyyrv

gorkyyrv2#

为了简洁起见,我认为orElseGet是您想要的:

void foo() {
    System.out.println("Prints only foo");
    System.out.println(Optional.of("foo").orElseGet(() -> other()));
    System.out.println("Prints foo and bar");
    System.out.println(Optional.of("foo").orElse(other()));
}
private String other() {
    System.out.println("bar");
    return "bar";
}

相关问题