【问题标题】:List of comma separated String to Map of list using java 8使用 java 8 将逗号分隔的字符串列表映射到列表的映射
【发布时间】:2018-07-20 02:36:21
【问题描述】:

我有一个逗号分隔的字符串列表 -

List: format = <unique id, label>
----- values -----
ab123,X
cd123,Y
ab123,Y
cd123,Z
------------------

我想使用 java 8 将此列表转换为 Map&lt;String, List&lt;String&gt;&gt;,其中键是唯一 id,值是标签列表 (Map&lt;unique-id, List&lt;label&gt;&gt;).

例子-

Map[
ab123=List[X, Y],
cd123=List[Y, Z]
]

您能帮我一下吗,以便我可以使用 java 8 来实现它。

如果我想使用 dto 类,也可以代替 Map -

Class A {
 private String id;
 private List<String> labelList;
 // Getters and Setters methods
}

我希望创建一个class A 的列表,例如 -

List[
A [id="ab123", labelList = List[X, Y],
A [id="cd123", labelList = List[Y, Z]
]

我怎么能得到它?

【问题讨论】:

    标签: java collections java-8 hashmap


    【解决方案1】:
    yourList.stream()
            .map(x -> x.split(",", 2))
            .collect(Collectors.groupingBy(
                x -> x[0],
                Collectors.mapping(x -> x[1], Collectors.toList())
    
    ));
    

    【讨论】:

    • 你应该在这里使用x.split(",", 2)...
    • @Holger 我知道它存在,老实说,我不知道它到底是什么。读不下去了……
    • 想想如果字符串包含多个逗号会发生什么……
    • @Holger 谢谢你的又一课,现在理解并编辑了
    【解决方案2】:

    使用正则表达式匹配过滤所有不匹配给定模式的字符串:

    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
    
    public class ListToMapExample {
    
        public static void main(String[] args) {
            final List<String> list = Arrays.asList("ab123,X", "cd123,Y", "ab123,Y", "cd123,Z", "incorrect string", "", "a");
            final Pattern pattern = Pattern.compile("^([^,]+),(.*)$");
    
            final Map<String, List<String>> map = list.stream()
                    .map(pattern::matcher)
                    .filter(Matcher::matches)
                    .collect(Collectors.groupingBy(
                            matcher -> matcher.group(1), 
                            Collectors.mapping(
                                    matcher -> matcher.group(2), 
                                    Collectors.toList()
                            ))
                    );
    
            System.out.println(map);
        }
    }
    

    输出:

    {cd123=[Y, Z], ab123=[X, Y]}
    

    【讨论】:

      猜你喜欢
      • 2014-01-14
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多