要映射的动态字符串列表

时间:2019-07-11 14:09:17

标签: java list dictionary java-8 java-stream

是否存在将以下列表转换为地图列表的有效方法?我正在寻找使用Java Streams的优化解决方案。非常感谢您的帮助。

List<String>

[
    "src/main/java/com/abc.java",
    "68",
    "src/main/java/com/def.java",
    "21",
    "src/main/java/com/ghi.java",
    "4",
    "9",
    "58,3",
    "61,0",
    "src/main/java/com/jkl.java",
    "3",
    "12",
    "src/main/java/com/mno.java",
    "8,0",
    "13",
    "40,5",
    "48,2",
    "61,5"
]

List<Map<String, List<String>>>

[{
        "src/main/java/com/abc.java": ["68"]
    },
    {
        "src/main/java/com/def.java": ["21"]
    },
    {
        "src/main/java/com/ghi.java": ["4", "9", "58", "59", "60"]
    },
    {
        "src/main/java/com/jkl.java": ["3", "12"]
    },
    {
        "src/main/java/com/mno.java": ["13", "40", "41", "42", "43", "44", "48", "49", "61", "62", "63", "64", "65"]
    }
]

1 个答案:

答案 0 :(得分:0)

在这种情况下,我强烈建议您不要使用,因为您依赖于前面的元素。

Map<String, List<String>> o = list.stream()
   .reduce(
        new TreeMap<String, List<String>>(),
        (map,j) -> {
            if (j.startsWith("src")) {
                map.putIfAbsent(j, new ArrayList<>());
            } else {
                map.get(map.lastKey()).add(j);
            }
            return map;},
        (i,j) -> i);

据您所知,该解决方案有许多缺陷:非常笨拙,难以阅读并且违反了no side effects principle

  

通常不鼓励流操作的行为参数产生副作用,因为它们经常会导致无意识地违反无状态要求以及其他线程安全危害。

将其与传统的,基于过程和基于循环的解决方案进行比较,该解决方案更适合此类处理:

final Map<String, List<String>> map = new HashMap<>();
String lastKey = null;
for (String item: list) {
    if (item.startsWith("src")) {
        map.putIfAbsent(item, new ArrayList<>());
        lastKey = item;
    } else {
        map.get(lastKey).add(item);
    }
}

您问:

  

我正在寻找使用Java Streams的优化解决方案

我能回答的所有事情:首先考虑任何可行的解决方案,然后使其对其他开发人员可维护和可读。最后,考虑一下效率和性能。