按 java8 中的 Stream groupingby 的字符串集合分组
Group by a Collection of String with Stream groupingby in java8
如何用表达式Stream
groupingBy
运算Java8来完成这个?
我想转 Set<String> allTextFileList
包含:
20150101_00b667339f32fcff37db6e89aea53065.txt
20150101_06d0e76e4782cff3ce455feecf72b80d.txt
20150301_11f706c03860068e7e736ff943525504.txt
20150301_33719f3b98081b32e9ffd3b932e1902d.txt
到包含
的Map<String, Set<String>> textFileListBydate
20150101 ->
- 20150101_00b667339f32fcff37db6e89aea53065.txt
- 20150101_06d0e76e4782cff3ce455feecf72b80d.txt
20150301 ->
- 20150301_11f706c03860068e7e736ff943525504.txt
- 20150301_33719f3b98081b32e9ffd3b932e1902d.txt
基本上,您想要按文件名的第一部分进行分组,即从开头到 "_"
的第一个索引的子字符串。
对于此任务,您可以使用 Collectors.groupingBy(classifier, downstream)
。
classifier
是一个函数,用于确定如何在结果 Map
中对对象进行分类。在这种情况下,函数将 return 文件名的第一部分。
downstream
是一个 Collector
,它减少了具有相同分类器的所有值。在这种情况下,我们需要使用收集到 Set
的收集器,即 Collectors.toSet()
.
代码:
Map<String, Set<String>> textFileListBydate =
allTextFileList.stream()
.collect(groupingBy(s -> s.substring(0, s.indexOf('_')), toSet()));
如何用表达式Stream
groupingBy
运算Java8来完成这个?
我想转 Set<String> allTextFileList
包含:
20150101_00b667339f32fcff37db6e89aea53065.txt
20150101_06d0e76e4782cff3ce455feecf72b80d.txt
20150301_11f706c03860068e7e736ff943525504.txt
20150301_33719f3b98081b32e9ffd3b932e1902d.txt
到包含
的Map<String, Set<String>> textFileListBydate
20150101 ->
- 20150101_00b667339f32fcff37db6e89aea53065.txt
- 20150101_06d0e76e4782cff3ce455feecf72b80d.txt
20150301 ->
- 20150301_11f706c03860068e7e736ff943525504.txt
- 20150301_33719f3b98081b32e9ffd3b932e1902d.txt
基本上,您想要按文件名的第一部分进行分组,即从开头到 "_"
的第一个索引的子字符串。
对于此任务,您可以使用 Collectors.groupingBy(classifier, downstream)
。
classifier
是一个函数,用于确定如何在结果Map
中对对象进行分类。在这种情况下,函数将 return 文件名的第一部分。downstream
是一个Collector
,它减少了具有相同分类器的所有值。在这种情况下,我们需要使用收集到Set
的收集器,即Collectors.toSet()
.
代码:
Map<String, Set<String>> textFileListBydate =
allTextFileList.stream()
.collect(groupingBy(s -> s.substring(0, s.indexOf('_')), toSet()));