gpt4 book ai didi

java - 如何使用流代替 for 循环及其好处

转载 作者:行者123 更新时间:2023-12-01 07:43:56 25 4
gpt4 key购买 nike

我有两个对象数组data1data2 。我使用 for 循环过滤数据,如下所示:

for (int i = 0; i < data1.size(); i++) {

for (int j = 0; j < data2.size(); j++) {

if (data1.get(i).getId().equals(data2.get(j).getID())) {

data1.get(i).setHome(data2.get(j).getHome());

}

}

}

Everting 工作得很好,但我想优化代码,我想使用 stream而不是 for 循环。

最佳答案

I want to optimize code. I want to use the stream instead the for loop.

这两件事不一定相同。

  • 在这种情况下,简单的嵌套循环可能比使用流的直接等效公式更快、更高效。

  • 如果在流公式中使用并行,流公式可能会更快,但不会更高效。 (与非并行情况相比,每完成一个工作单元您将使用更多的 CPU 周期。)

让我们退一步看看实际的算法:

  • 您当前的算法正在将一个列表中的每个元素与另一个列表中的每个元素进行比较。这就是复杂度 O(MN),其中 M 和 N 是列表大小。

  • 对于流(非并行),复杂性是相同的。

  • 通过流和并行性,可能有高达 P 的加速系数,其中 P 是物理数量处理器。但这假设:

    1. P 处理器全部可用并在处理过程中使用,
    2. 列表大小足够大,并行化的开销(例如对列表进行分区)可以忽略不计,并且
    3. 不存在令人困惑的二阶效应,例如内存总线争用或垃圾收集。
  • 如果我们假设列表中对象的 id 是唯一的,那么当您获得匹配项时,您可以打破内部循环。这大致表明性能提高了 2 倍。

  • 我们可以使用从列表之一构建的 E 元素的 Map(TreeMapHashMap`)查找来替换内部循环。

    • 使用TreeMap,查找的复杂度为O(log E),构建 map 的复杂度为O(ElogE) >。整体复杂度将为“O(N'logM')”,其中 N' 是 M 中较大的一个,N 和 M' 是较小的一个。
    • 使用 HashMap 时,查找的复杂度为 O(1),构建映射的复杂度为 O(E) 。总体复杂度将为 O(N'),其中 N' 是 M 和 N 中较大的一个。
    • 对于足够大的 M 和 N,使用 map 会更有效。
    • 如果您可以用 map 完全替换其中一个列表,那么您就可以避免“每次”运行代码时都必须重建 map 。
    • 但是两者都需要 O(M') 额外空间来表示 map 。
  • 使用 Map 的另一种方法是对两个列表进行就地排序,使它们符合 id 顺序。然后,您使用合并算法迭代两个列表,并在条目匹配时进行所需的更改。这具有大约 O(N'logN') 复杂度,其中 N' 是 M 和 N 中较大的一个,并且它不使用额外的空间。 (假设排序确实就地。)但这也更复杂。

<小时/>

所以这是我基于上述的优化:

// This assumes `list2` is the smaller of the lists.  If you don't know
// which one is likely to be smaller, you may need two versions of the code.

Map<Id, Record> map = new HashMap<>();
for (Record record: list2) {
map.put(record.getId(), record);
}

for (Record record: list1) {
Record record2 = map.get(record.getId());
if (record2 != null) {
record.setHome(record2.getHome());
}
}

关于java - 如何使用流代替 for 循环及其好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58896274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com