4

如何使用Stream groupingByJava 8 的表达式操作来完成这个?

我想转一个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
4

1 回答 1

6

基本上,您希望按文件名的第一部分进行分组,即从开头到"_".

对于此任务,您可以使用Collectors.groupingBy(classifier, downstream).

  • classifier是一个函数,确定如何对结果中的对象进行分类Map。在这种情况下,该函数将返回文件名的第一部分。
  • downstreamCollector减少具有相同分类器的所有值的 a。在这种情况下,我们需要使用收集器来收集到 a Set,即Collectors.toSet()

代码:

Map<String, Set<String>> textFileListBydate = 
            allTextFileList.stream()
                           .collect(groupingBy(s -> s.substring(0, s.indexOf('_')), toSet()));
于 2015-11-08T17:04:32.903 回答