【问题标题】:Can I actually return from lambda to return from method and break its execution?我真的可以从 lambda 返回以从方法返回并中断其执行吗?
【发布时间】:2017-08-03 12:45:49
【问题描述】:

例如:

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

所以当我调用 test(myOptional) 时,它会返回“1”;

【问题讨论】:

  • 您可以返回Function。这符合你的需要吗?你会打电话给test().apply()
  • 好吧,你写了代码,它有效吗?只需将它放在一个类中并运行它。
  • 示例返回另一个 lambda,但如果你只想返回一个字符串,它的做法是一样的
  • @litelite 不,他在询问终止封闭方法并从 lambda 内部返回值的可能性

标签: java lambda optional


【解决方案1】:

您不能“突破” lambda 主体并从封闭方法返回值。 lambda 中使用的return 仅在 lambda 主体的范围内有效。

惯用的方法是正确利用Optional API:

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

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

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

【讨论】:

  • 好答案。比我的好。我会将函数定义为:private &lt;T&gt; String test(Optional&lt;T&gt; myOptional)
  • @Michael 很难说 OP 的意图是什么,但肯定是有效的选项之一
  • 完美答案,谢谢!但是为了避免下一个方法指令执行而中断方法的执行是不可能的,对吧?
【解决方案2】:

您遇到的问题是 return 被视为 lambda 函数的返回,不是“测试”函数的返回。

Optional.ifPresent 不希望得到一个返回值的函数。它需要一个Consumer&lt;T&gt;,它实际上是一个只接受一个参数并且什么都不返回的函数。作为一个普通函数,而不是 lambda,它看起来像这样:

void myConsumer(String s)
{
    System.out.println(s);
}

您可能想使用isPresent('is' 而不是 'if'):

if (myOptional.isPresent())
{
     return "1";
}
else
{
     return "0";
}

或使用三元运算符:

return myOptional.isPresent() ? "1" : "0";

顺便说一句,您使用的是Optional 的原始类型。这将导致编译器警告。您应该使用泛型声明Optional 将持有什么类型:

Optional<String> myOptional = /*something*/;

这将为您提供编译时类型安全,Optional 不会保存字符串以外的值。

【讨论】:

  • 我认为他是在询问一个从整个方法中中断的返回
  • @pivovarit 是的。你的回答让我明白了。我会稍微修改一下我的答案。
猜你喜欢
  • 2019-12-23
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多