中断或从 Java 8 流返回 forEach?

2022-08-31 04:39:52

当对一个循环使用外部迭代时,我们使用或从增强的每个循环中作为:Iterablebreakreturn

for (SomeObject obj : someObjects) {
   if (some_condition_met) {
      break; // or return obj
   }
}

我们怎么能或在Java 8 lambda表达式中使用内部迭代,例如:breakreturn

someObjects.forEach(obj -> {
   //what to do here?
})

答案 1

如果您需要此功能,则不应使用 ,而应使用 流上可用的其他方法之一;哪一个,取决于你的目标是什么。forEach

例如,如果此循环的目标是找到与某些谓词匹配的第一个元素:

Optional<SomeObject> result =
    someObjects.stream().filter(obj -> some_condition_met).findFirst();

(注意:这不会迭代整个集合,因为流是懒惰地计算的 - 它将在与条件匹配的第一个对象处停止)。

如果您只想知道集合中是否存在条件为 true 的元素,则可以使用 :anyMatch

boolean result = someObjects.stream().anyMatch(obj -> some_condition_met);

答案 2

lambda 中的返回值等于 for-each 中的连续值,但没有等效于中断的回报。您可以只做一个返回以继续:

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