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

问题描述 投票:0回答:3

例如:

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

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

java lambda option-type
3个回答
9
投票

您无法“突破” lambda 主体并从封闭方法返回值。 lambda 中使用的

return
仅在 lambda 主体的范围内起作用。

惯用的方法是正确利用

Optional
API:

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

另外,请记住

Optional
s 不应用作方法参数:

为什么Java 8的Optional不能在参数中使用


1
投票

您遇到的问题是

return
被视为 lambda 函数的返回,而不是 'test' 函数的返回。

Optional.ifPresent

 不希望得到一个返回值的函数。它需要一个 
Consumer<T>
,它实际上是一个只接受一个参数且不返回任何内容的函数。作为一个普通函数,而不是 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

不会保存字符串以外的值。

    


0
投票

public void executeAction(final Consumer<EntityManager> action) { //Any code } final AtomicInteger rowsDeleted = new AtomicInteger(); jpaManager.executeAction((aux) -> { rowsDeleted.set(aux.createQuery(delete).executeUpdate()); }); return rowsDeleted.get();

	
© www.soinside.com 2019 - 2024. All rights reserved.