如果代码
Optional<String> optStr = Optional.of("foo");
String result;
optStr.ifPresent(s -> result = s);
是合法的,但它仍然是无用的,因为在调用后变量没有明确分配。Java 不允许读取仅进行条件初始化的局部变量。因此,对于空的情况,您需要一个替代值,例如:result
ifPresent
result
Optional
Optional<String> optStr = Optional.of("foo");
String result=null;// or any other default value
optStr.ifPresent(s -> result = s);
但是,如果您定义了这样的默认/回退值,则可以使用用于此目的的方法:
Optional<String> optStr = Optional.of("foo");
String result=optStr.orElse(null /* or any other default value */);
当你说,你必须初始化多个变量时,它不会改变这些变量在任何一种情况下都需要初始化的事实。此外,在传递给 as 的 lambda 表达式中执行因变量的初始化也没有好处,毕竟,只携带一个值。依赖于该值的所有内容都可以在获得该值后确定,而与:Optional
Optional
Optional
Optional<String> optStr = Optional.of("foo");
Type1 variable1;
Type2 variable2;
Type3 variable3;
if(optStr.isPresent()) {
String s=optStr.get();
// determine and assign variable1, variable2, variable3 based on s
} else {
// assign defaults/fall-backs to variable1, variable2, variable3
}
请注意,即使您的变量已经预先初始化并且您想要改变它们,使用是最简单的方法。当您将此成语替换为 lambda 表达式时,没有什么比这更好的了。if(optional.isPresent()) /* local modifications */