Java Stream是Java 8中引入的新特性,它讓我們可以更好地處理集合數據,包括對數據的過濾、映射、統計、分組、分區等操作。分區和分組是Stream中兩個非常相似的操作,但是它們有著不同的使用場景和實現方式。
分區是將數據按照條件(滿足或不滿足)分隔成兩部分,使用的是Collectors.partitioningBy()方法。例如:
Map<Boolean, List<Person>> partitionedMap = persons.stream()
.collect(Collectors.partitioningBy(p -> p.getAge() > 30));
上面的代碼按照人的年齡是否大于30進行分區,得到兩部分人的列表(一部分是年齡大于30的人,一部分是不大于30的人),最終結果保存在一個Map對象中。
分組是將數據按照相同的屬性值分成一組,使用的是Collectors.groupingBy()方法。例如:
Map<String, List<Person>> groupedMap = persons.stream()
.collect(Collectors.groupingBy(p -> p.getGender()));
這段代碼按照人的性別將人分成了兩組,最終結果也保存在一個Map對象中。
可以看到,分區和分組有著共通的地方:它們都通過某種方式將數據分割成不同的部分,并將這些部分組織成一個Map對象。但是分區是根據是否滿足某個條件,將數據分成兩部分,而分組是根據相同的屬性值把數據分成多組。