【问题标题】:Want to find matching elements from two large data list using parallel stream in java 8想在 java 8 中使用并行流从两个大数据列表中查找匹配元素
【发布时间】:2021-01-29 19:31:24
【问题描述】:

我有一些代码,其中有两个 API 调用,并将数据存储在列表中。我想比较两个列表并找到匹配和不匹配的数据,如果匹配则将状态设置为“YES”,如果不匹配则将状态设置为“NO”。

如果数据列表少于 1000-1500 个元素,以下是可以完美运行的代码。当列表有超过 2000 条记录时,它需要的时间太长,这会影响应用程序性能,有时我会在服务器上收到超时错误。

下面是我在两个列表之间找到匹配数据并设置状态的代码。

AS400data 包含来自 AS400 的数据,我正在尝试将其与 Oracledata 进行比较,并将 docStatus 设置为“YES”或“NO”

AS400Data.parallelStream()
         .forEach(x -> x.setDocStatus(Oracledata.parallelStream()
                                                .filter(o -> o.equals(x))
                                                .findFirst()
                                                .isPresent() ? "Yes" : "No"));

有人可以帮助优化这篇文章吗?提前致谢。

【问题讨论】:

  • .filter(predicate) .findFirst() .isPresent() 可以简化为.anyMatch(predicate)。但是当谓词是 equals 测试时,你根本不应该使用 Stream,Mureinik’s answer 是要走的路。

标签: java list performance java-stream


【解决方案1】:

鉴于AS400Data 具有n 元素并且Oracledata 具有m 元素,您正在执行 O(n * m) 操作,即使它是并行完成的。您可以通过将Oracledata 转换为Set 将其简化为 O(n + m) 操作:

Set<SomeClass> oracleDataSet = new HashSet<>(oracleData);
AS400Data.parallelStream()
         .forEach(x -> x.setDocStatus(oracleDataSet.contains(x) ? "Yes" : "No"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多