【问题标题】:Return a value from Java 8 forEach loop从 Java 8 forEach 循环返回一个值
【发布时间】:2023-03-10 08:13:01
【问题描述】:

在下面的例子中, 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) 时,它只是退出循环?
  • 我喜欢这个答案。 stackoverflow.com/a/20177092/6253321

标签: java java-8


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2020-07-16
    • 2011-12-09
    • 2021-12-21
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多