Java ...嵌套优化循环

时间:2018-07-03 15:23:08

标签: java java-8

我在下面的代码中有一个嵌套循环,我想对其进行优化,因为我知道嵌套for循环非常昂贵,有人有不同的方法来实现此目的吗?

提前谢谢!

private List<Map<String, Object>> updateSomething(List<Map<String, Object>> list)
        throws MetadataException {
    for (Map<String, Object> map : list) {
        setFilePathAndOffsetParams(map);
        for (Map.Entry<String, String> entry : anotherMap.entrySet()) {
            updateKeyOnMap(map, entry.getKey(), entry.getValue());
        }
    }
    return list;
}

private void updateKeyOnMap(Map<String, Object> map, String newKey, String oldKey) {
    if (!newKey.equals(oldKey)) {
        map.put(newKey, map.get(oldKey));
        map.remove(oldKey);
    }

1 个答案:

答案 0 :(得分:5)

  

我在下面的代码中有一个嵌套循环,我想对其进行优化,因为我知道嵌套for循环非常昂贵,有人有不同的方法来实现此目的吗?

循环嵌套是否昂贵取决于执行每个循环的迭代次数以及每次迭代要完成的工作-尤其是对于最内部的循环。通常,专注于消除嵌套循环作为提高性能的机制是没有用的,因为简单地以不同方式分配工作的重组通常不会产生重大影响。只有通过重组您可以安排消除不必要的工作或增加并发性,这种重组才有意义。

尚不清楚这些替代方法是否适用于您的情况,但是提高并发性的最佳选择是并行处理列表元素。如果列表中可能包含重复的元素以及其他可能性,这是不安全的,但是如果合理,则可以这样编写:

list.parallelStream()
    .forEach(map -> {
        setFilePathAndOffsetParams(map);
        for (Map.Entry<String, String> entry : anotherMap.entrySet()) {
            updateKeyOnMap(map, entry.getKey(), entry.getValue());
        }
    });

请注意,尽管并行化可以缩短花费的时间,但它却增加了一些开销,却没有减少总的工作量。因此,它不会缩短总的CPU时间。