例如:
private String test(Optional myOptional)
{
myOptional.ifPresent(() -> return "1");
return "0";
}
因此,当我调用test(myOptional)时,它将返回" 1&#34 ;;
答案 0 :(得分:7)
你不能“破坏”lambda体并从封闭方法返回一个值。 lambda中使用的return
仅在lambda体的范围内起作用。
惯用的方法是正确地使用Optional
API:
private String test(Optional<Object> myOptional) {
return myOptional
.map(s -> "1")
.orElse("0");
}
另外,请记住Optional
不应该用作方法参数:
答案 1 :(得分:1)
您遇到的问题是return
被视为lambda函数的返回,不是返回'test'函数。
Optional.ifPresent
不期望获得返回值的函数。它期望Consumer<T>
实际上是一个函数,它只接受一个参数而不返回任何内容。作为一个正常的函数,而不是lambda,它看起来像这样:
void myConsumer(String s)
{
System.out.println(s);
}
您可能希望使用isPresent
(' '不是',如果'):
if (myOptional.isPresent())
{
return "1";
}
else
{
return "0";
}
或使用三元运算符:
return myOptional.isPresent() ? "1" : "0";
另外,您使用的原始类型为Optional
。这将导致编译器警告。您应该使用泛型声明Optional
将保留的类型:
Optional<String> myOptional = /*something*/;
这将为您提供编译时类型安全性,Optional
将不包含字符串以外的值。