从 Java 8 forEach 循环返回一个值

Posted

技术标签:

【中文标题】从 Java 8 forEach 循环返回一个值【英文标题】:Return a value from Java 8 forEach loop 【发布时间】:2018-04-10 20:42:58 【问题描述】:

在下面的例子中, someObjects 是一个集合。如果循环中的条件匹配,我试图返回 true ,但这似乎无法编译。但是,当我只添加“return”时,它工作正常。我需要解决什么问题?

public boolean find()

    someObjects.forEach(obj -> 
       if (some_condition_met) 
          return true;
       
    );

    return false;

编译错误

类型中的forEach(Consumer)方法 Iterable 不适用于参数 (( obj) -> )

【问题讨论】:

您在哪里添加“return”以使其工作? 什么是编译器错误?将输出添加到问题中。 不可能从 lambda 体内的外部方法返回。改用 for 循环 谢谢@cppbeginner。所以当我添加一个 return (without return value) 时,它只是退出循环? 我喜欢这个答案。 ***.com/a/20177092/6253321 【参考方案1】:

我猜你想这样做:

public boolean find()
    return someObjects.stream().anyMatch(o -> your_condition);

【讨论】:

可能不会。构建流有开销。使用老式(Java 8 之前)的方式会更好。 @DawoodibnKareem 我假设 OP 想要功能风格的东西。从他的分数来看,他应该知道如何以老式的方式来做。 也许,但这显然是“功能风格”是错误解决方案的情况。 @DidierL 我完全同意你的看法。现实生活中的软件实践将像这样的微观性能放在优先级队列的最后。有很多论据可以反对这种说法。 @DawoodibnKareem 考虑到所有用流实现的东西都可以在没有的情况下重写,根据你的逻辑,你永远不应该使用流。【参考方案2】:

Collection 中的 forEach 方法需要一个 Consumer,这意味着一个接受值但不返回任何内容的函数。这就是为什么您不能使用 return true;return; 可以正常工作的原因。

如果您想在满足条件时跳出循环,最好使用简单的for(...) 循环。我假设obj的类型是Object

for (Object obj : someObjects) 
  if (some_condition_met) 
    return true;
  


return false;

【讨论】:

谢谢,我假设退货无效时退货如何工作? return 只是退出循环吗? 没有。在您的示例中,return; 将简单地退出 lambda 并继续到集合中的下一个元素。循环不会结束。 谢谢!所以我想这和继续一样。 是的,它实际上与“标准”循环中的 continue 相同。【参考方案3】:

forEach 接受 Consumer,因此您不能传入不返回 void 的行为。您需要执行以下操作:

return someObjects.stream().anyMatch(e -> condition);

【讨论】:

以上是关于从 Java 8 forEach 循环返回一个值的主要内容,如果未能解决你的问题,请参考以下文章

foreach循环查询提示错误

前端面试题,map,forEach,for循环,三个都能遍历,什么区别?

Js中数组的forEach()方法return无法退出循环

返回所有带有 ACF 字段和 foreach 循环的数组值

使用java 8中的forEach(..)而不是java 5中的forEach循环的任何优势[重复]

从 java 中的 lambda forEach() 返回