如何将字符串拆分为映射,使用流按重复键对值进行分组?

TAu*_*sti 1 java string key-value java-8 java-stream

我想转换以下内容

String flString="view1:filedname11,view1:filedname12,view2:fieldname21";
Run Code Online (Sandbox Code Playgroud)

到 aMap<String,Set<String>>获取键/值如下:

view1=[filedname11,filedname12]
view2=[fieldname21]
Run Code Online (Sandbox Code Playgroud)

我想使用 Java 8 流。我试过

view1=[filedname11,filedname12]
view2=[fieldname21]
Run Code Online (Sandbox Code Playgroud)

然而,键也被添加到值列表中。

K.N*_*las 8

您应该使用 aCollectors::mapping将数组映射到元素。

String flString = "view1:filedname11,view1:filedname12,view2:fieldname21";

Map<String, List<String>> map = Pattern.compile(",")
    .splitAsStream(flString)
    .map(a -> a.split(":"))
    .collect(
        Collectors.groupingBy(a -> a[0],
            Collectors.mapping(a -> a[1], Collectors.toList())
        )
    );

map.entrySet().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出

String flString = "view1:filedname11,view1:filedname12,view2:fieldname21";

Map<String, List<String>> map = Pattern.compile(",")
    .splitAsStream(flString)
    .map(a -> a.split(":"))
    .collect(
        Collectors.groupingBy(a -> a[0],
            Collectors.mapping(a -> a[1], Collectors.toList())
        )
    );

map.entrySet().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)