将列表流拆分为地图是否需要自定义收集器?
split a list stream into a map does need a custom Collector?
我是 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);
有什么建议吗?
类似这样的事情(顺便说一句,你真的很接近):
xyzList.stream()
.map(x -> x.split("\."))
.collect(
Collectors.groupingBy(arr -> arr[0],
Collectors.mapping(
arr -> arr[1],
Collectors.joining("-"))))
我是 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);
有什么建议吗?
类似这样的事情(顺便说一句,你真的很接近):
xyzList.stream()
.map(x -> x.split("\."))
.collect(
Collectors.groupingBy(arr -> arr[0],
Collectors.mapping(
arr -> arr[1],
Collectors.joining("-"))))