根据文档,两者之间的区别
orElse 和 orElseGet 实际上是在 orElseGet(x) 的情况下 x 部分
在 Optional.isPresent 为 false 的情况下被调用
但是在下面的程序中,如果供应商 x 是 orElseGet(x) 中的另一个方法调用
即使 Optional.isPresent 是真的,也会调用 x 部分,类似于
的行为orElse()。为什么这个场景中 orElseGet() 的行为和 orElse() 一样?
import java.util.Optional;
import java.util.function.Supplier;
public class TestOrElseGet {
public static void main(String[] args) {
checkOrElseGet();
}
private static void checkOrElseGet() {
System.out.println("------Start Optional.orElseGet-------");
String first= getFirst();
// else part is not initialized
// else doesn't get initialized if its inside OrElseGet()
String myoptional = Optional.of(first).orElseGet(() -> {
System.out.println("OrElseGet - Create & Return Second");
return "Second";
});
System.out.println(
"Result of OrElseGet " + myoptional);
// if supplier is a method then its gets called
myoptional = Optional.of(getThird()).orElseGet(getNumberFromSupplier());
System.out.println(" Result of OrElseGet is "
+ myoptional);
Optional<String> empty = Optional.empty();
// OrElseGet - else is initialized as optional was empty
myoptional = empty.orElseGet(() -> {
System.out.println("OrElseGet - Create & Return Fourth");
return "Four" ;
});
System.out.println("Result of OrElseGEt is " + myoptional);
System.out.println("----------Completed-----------");
}
private static Supplier<String> getNumberFromSupplier() {
System.out.println("Inside Supplier call..");
return ()->{
return "Supplying TEN";
};
}
private static String getThird() {
System.out.println("Inside Third");
return "Third";
}
private static String getFirst() {
System.out.println("Inside GetFirst");
return "First";
}
}