我可以实际从lambda返回从方法返回并中断其执行吗?

时间:2017-08-03 12:45:49

标签: java lambda optional

例如:

private String test(Optional myOptional)
{
    myOptional.ifPresent(() -> return "1");
    return "0";
}

因此,当我调用test(myOptional)时,它将返回" 1&#34 ;;

2 个答案:

答案 0 :(得分:7)

你不能“破坏”lambda体并从封闭方法返回一个值。 lambda中使用的return仅在lambda体的范围内起作用。

惯用的方法是正确地使用Optional API:

private String test(Optional<Object> myOptional) {
    return myOptional
      .map(s -> "1")
      .orElse("0");
}

另外,请记住Optional不应该用作方法参数:

Why should Java 8's Optional not be used in arguments

答案 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将不包含字符串以外的值。