【问题标题】:split a list stream into a map does need a custom Collector?将列表流拆分为地图是否需要自定义收集器?
【发布时间】:2017-11-06 20:33:16
【问题描述】:

我是 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&lt;String, String&gt; 喜欢

{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);

有什么建议吗?

【问题讨论】:

  • 剥离mappingCollector中的第一部分。

标签: java java-8 java-stream collectors


【解决方案1】:

类似这样的事情(顺便说一句,你真的很亲密):

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

【讨论】:

  • 是的...这正是需要...如果您能详细说明一下 Collectors.mapping 会很棒..谢谢!
  • @FlascheLeer 我不知道该说什么。 .. 它基本上在收集元素之前将它们映射(应用函数)
  • @FlascheLeer 实际上只是今天在这里对这些事情进行了很好的解释:stackoverflow.com/questions/47125135/…
猜你喜欢
  • 2017-05-17
  • 2013-08-04
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2016-08-13
相关资源
最近更新 更多