将列表流拆分成地图是否需要自定义收集器?

时间:2017-11-06 20:33:16

标签: java java-8 java-stream collectors

是Stream的新手,但不是那么多......这是我的问题:

我有一个列表正在从pc上读取我的用户在exe文件上有某种权利 ...我得到的列表看起来像

List<String> xyzList = new ArrayList<>();
xyzList.add("USER1.READ");
xyzList.add("USER1.WRITE");
xyzList.add("USER1.EXECUTE");
xyzList.add("USER1.DELETE");
xyzList.add("USER2.READ");
xyzList.add("USER3.READ");
xyzList.add("USER2.EXECUTE");

我想要Map<String, String>喜欢

{USER1 = READ-WRITE-EXECUTE-DELETE, USER2 = READ-WRITE, USER3 = READ}

但我的代码正在制作:

{USER1=USER1.READ-USER1.WRITE-USER1.EXECUTE-USER1.DELETE,  USER2=USER2.READ-USER2.EXECUTE, USER3=USER3.READ}

我知道我可以编辑这组值,如果我决定继续使用该结果,但我正在寻找一种更优雅的方式来获取它只在一个流指令中我觉得我需要一个自定义收集器...

我的尝试到目前为止..

Map<String, String> result = xyzList
        .stream()
        .collect(
             Collectors.groupingBy(x -> x.split("\\.")[0],  
             Collectors.joining("-", "", "")
         ));

System.out.println(result);

任何建议?

1 个答案:

答案 0 :(得分:14)

这样的事情(你真的非常接近btw):

xyzList.stream()
       .map(x -> x.split("\\."))
       .collect(
            Collectors.groupingBy(arr -> arr[0],
            Collectors.mapping(
                         arr -> arr[1], 
                         Collectors.joining("-"))))