【问题标题】:How can I simplify these nested for loops with collectors in Java 8?如何在 Java 8 中使用收集器简化这些嵌套的 for 循环?
【发布时间】:2017-03-16 06:09:55
【问题描述】:

我对 Java 中的收集器和并行流的想法非常陌生,我想知道是否有办法简化这段代码:

boolean foundAnyMatch = false;
for (MyObject myObject : hashSetOfObjects) {
    for (int i = 0; i < arrayOfStrings.length; i++) {
        if (myObject.customMethodReturnsBool(arrayOfStrings[i])) {
            foundAnyMatch = true;
            break;
        }
    }
}

如您所料,hashSetOfObjectsSet&lt;MyObject&gt; 类型,其中MyObject 类包含带有签名boolean customMethodReturnsBool(String entry) 的方法。此外,arrayOfStrings 只是 String[] 类型。

【问题讨论】:

  • 我怀疑使用 Streams 会简化代码。

标签: java java-stream collectors


【解决方案1】:

据我了解,您的代码在 hashSetOfObjects 上运行 O(n) 次。虽然您的目的是查找 hashSetOfObjects 中的任何对象是否真正导致嵌套代码。 使用流可以表示相同的逻辑:

boolean foundAnyMatch = hashSetOfObjects.stream
                           .anyMatch(x -> arrayOfStrings.streams
                                            .anyMatch(y -> x.customMethodReturnsBool(y)));

【讨论】:

  • 当我输入这个时,我立即得到编译器错误,但它引导我走上了正确的道路。以下是我如何调整您的代码:boolean foundAnyMatch = hashSetOfObjects.stream().anyMatch(x -&gt; Arrays.stream(arrayOfStrings).anyMatch(y -&gt; y.customMethodReturnsBool(x)));
猜你喜欢
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多