使用Lambda Map函数代替迭代来填充Map

blu*_*sky 2 java lambda java-8

下面的代码转换字符串列表,其中键和值由"."分隔.输入Map<String, java.util.List<String>>

public static void main(String args[]) {

        java.util.List<String> l = new java.util.ArrayList<String>();
        l.add("key1.value1");
        l.add("key1.value2");
        l.add("key2.value3");

        java.util.Map<String, java.util.List<String>> map = new java.util.HashMap<String, java.util.List<String>>();

        l.forEach(line -> {
            String[] sa = line.split("\\.");
            List<String> ls = map.get(sa[0]);
            if (ls == null) {
                List<String> initial = new ArrayList<String>();
                initial.add(sa[1]);
                map.put(sa[0], initial);
            } else {
                ls.add(sa[1]);
            }
        });

        for (Entry<String, List<String>> entry : map.entrySet()) {
            String key = entry.getKey();
            List<String> value = entry.getValue();
            System.out.println(key+","+StringUtils.join(value , ","));
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用java lambdas有更好的方法吗?可能使用地图功能?

注意:StringUtils是commons-lang lib的一部分:

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 5

正确的流版本应该使用groupingBy收集器:

Map<String, List<String>> map = l.stream().map(s -> s.split("\\."))
        .map(s -> s.length > 1 ? s : new String[] {s[0], ""})
        .collect(
             Collectors.groupingBy(s -> s[0], 
                 Collectors.mapping(s -> s[1], 
                     Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

另请注意,在Java-8中有String.join方法,因此您不需要StringUtils打印结果:

map.entrySet().stream()
    .map(e -> e.getKey()+","+String.join(",", e.getValue()))
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)