2015-11-08 85 views
2

如何使用表達式StreamgroupingBy Java 8的操作完成此操作?由java8中的字符串與流分組合成的集合

我想打開含有Set<String> allTextFileList

20150101_00b667339f32fcff37db6e89aea53065.txt 
20150101_06d0e76e4782cff3ce455feecf72b80d.txt 
20150301_11f706c03860068e7e736ff943525504.txt 
20150301_33719f3b98081b32e9ffd3b932e1902d.txt 

於含

20150101 -> 
- 20150101_00b667339f32fcff37db6e89aea53065.txt 
- 20150101_06d0e76e4782cff3ce455feecf72b80d.txt 

20150301 -> 
- 20150301_11f706c03860068e7e736ff943525504.txt 
- 20150301_33719f3b98081b32e9ffd3b932e1902d.txt 

回答

2

基本上Map<String, Set<String>> textFileListBydate,要組由文件名的第一部分,即子串從起始開始到"_"的第一個索引。您可以使用Collectors.groupingBy(classifier, downstream)

  • classifier是一個函數確定如何對象在所得Map分類。在這種情況下,它是返回文件名第一部分的函數。
  • downstream是一個Collector減少具有相同分類器的所有值。在這種情況下,我們需要使用收集到Set的收集器,即Collectors.toSet()

代碼:

Map<String, Set<String>> textFileListBydate = 
      allTextFileList.stream() 
          .collect(groupingBy(s -> s.substring(0, s.indexOf('_')), toSet()));