網頁

2021/4/9

Java Stream 使用 Collectors.partitioningBy() 將集合依條件分成兩組

一個集合使用Java 8 Stream管線操作時,若要依集合元素的某些條件分成兩組,可使用Collectors.partitioningBy()

例如一個List中有整數1-9,將大於5的分成一堆,不大於5的分成一堆。

使用Collectors.partitioningBy()分好的集合會放在Map<Boolean, List<T>>中,符合條件的集合的key為true,反之為false。

List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

Map<Boolean, List<Integer>> partitionedMap = 
        intList.stream().collect(Collectors.partitioningBy(i -> i > 5));

List<Integer> gt5IntList = partitionedMap.get(true); // [6, 7, 8, 9]
System.out.println(gt5IntList);

List<Integer> le5IntList = partitionedMap.get(false); // [1, 2, 3, 4, 5]
System.out.println(le5IntList);

下面使用傳統的寫法依上述條件分成兩堆。

List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

List<Integer> gt5IntList = new ArrayList<>();
List<Integer> le5IntList = new ArrayList<>();
for (int i : intList) {
    if (i > 5) {
        gt5IntList.add(i);
    } else {
        le5IntList.add(i);
    }
}
System.out.println(gt5IntList); // [6, 7, 8, 9]
System.out.println(le5IntList); // [1, 2, 3, 4, 5]


沒有留言:

張貼留言