从 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 循环返回一个值的主要内容,如果未能解决你的问题,请参考以下文章
前端面试题,map,forEach,for循环,三个都能遍历,什么区别?