java-8 - Java8 -Optional.orElseGet 在 () 与方法调用中定义的供应商
问题描述
根据文档,两者之间的区别
orElse 和 orElseGet 是在 orElseGet(x) 的情况下 x 部分
被称为 incase Optional.isPresent 为假
但是在下面的程序中,如果供应商 x 是 orElseGet(x) 中的另一个方法调用
即使 Optional.isPresent 与
要不然()。为什么 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";
}
}
解决方案
的合同orElseGet(Supplier)
说 →<code>Supplier← 只有在值不存在时才会被调用。更具体地说,它是Supplier#get()
延迟调用的方法(在Supplier
传递给的实例上orElseGet
)。
你的代码表明了这一点。但是,这一点:
private static Supplier<String> getNumberFromSupplier() { System.out.println("Inside Supplier call.."); return ()->{ return "Supplying TEN"; }; }
表示误解。您的println
日志显示“Inside Supplier call...”,但此时您不在供应商内部。是Supplier
lambda 表达式并从方法返回。也就是说,您正确getNumberFromSupplier
地调用了该方法,但那是因为它的返回值作为参数传递给orElseGet
调用。即使是出于同样的原因急切地创建orElseGet(() -> ... )
。Supplier
如果您有以下情况:
private static Supplier<String> getNumberFromSupplier() {
// Remember, the lambda is the implementation of Supplier#get()
return () -> {
System.out.println("Inside Supplier call...");
return "Supplying TEN";
};
}
然后你会看到Supplier
被懒惰地调用。注意println
呼叫的新位置。此外,将该方法命名getNumberSupplier
为更好,因为这更恰当地描述了该方法的实际作用。
推荐阅读
- r - 我可以在闪亮的同一个表格单元格中放置多个下载链接吗?
- mysql - mysql查询获得最高分
- python-3.x - CreateAPIView 错误:必须实现`create()`
- c - C: compiling and linking component programs separately using 'ld'?
- python - 我尝试了很多使用 jinja 在彼此内部创建两个变量,但我不知道该怎么做
- spring - 在 SpringBoot 中为一个类完成测试后清理测试脚本
- .net - 实体框架中的插入顺序不正确或随机
- node.js - 如何下载 Glacier 存储类对象?
- cron - 在 Crontab 中启用/禁用特定作业
- javascript - 如何修复 CLIENT_MISSING_INTENTS 错误?