java8 streams_Java 8 Streams API:对流进行分组和分区
java8 streams
這篇文章展示了如何使用Streams API中可用的Collectors將具有groupingBy的流元素和具有partitioningBy的流元素進行groupingBy 。
考慮一系列Employee對象,每個對象都有名稱,城市和銷售數量,如下表所示:
+----------+------------+-----------------+ | Name | City | Number of Sales | +----------+------------+-----------------+ | Alice | London | 200 | | Bob | London | 150 | | Charles | New York | 160 | | Dorothy | Hong Kong | 190 | +----------+------------+-----------------+分組
讓我們開始使用命令式(Java-Lamba)按城市對員工進行分組:
Map<String, List<Employee>> result = new HashMap<>(); for (Employee e : employees) {String city = e.getCity();List<Employee> empsInCity = result.get(city);if (empsInCity == null) {empsInCity = new ArrayList<>();result.put(city, empsInCity);}empsInCity.add(e); }您可能熟悉這樣的代碼編寫,并且您可以看到,完成如此簡單的任務需要很多代碼!
在Java 8中,您可以使用groupingBy收集器對單個語句執行相同的操作,如下所示:
Map<String, List<Employee>> employeesByCity =employees.stream().collect(groupingBy(Employee::getCity));結果如下圖:
{New York=[Charles], Hong Kong=[Dorothy], London=[Alice, Bob]}通過將counting收集器傳遞給groupingBy收集器,還可以計算每個城市的雇員counting 。 第二收集器對分類為同一組的流中的所有元素執行進一步的還原操作。
Map<String, Long> numEmployeesByCity =employees.stream().collect(groupingBy(Employee::getCity, counting()));結果如下圖:
{New York=1, Hong Kong=1, London=2}順便說一句,這等效于以下SQL語句:
select city, count(*) from Employee group by city另一個示例是計算每個城市的平均銷售數量,可以使用averagingInt收集器結合groupingBy收集器來完成:
Map<String, Double> avgSalesByCity =employees.stream().collect(groupingBy(Employee::getCity,averagingInt(Employee::getNumSales)));結果如下圖:
{New York=160.0, Hong Kong=190.0, London=175.0}分區
分區是一種特殊的分組,其中的結果映射最多包含兩個不同的組-一個用于true ,一個用于false 。 例如,如果您想找出最好的員工是誰,則可以使用partitioningBy收集器將他們分為銷售額超過N的員工和銷售額不超過N的員工。
Map<Boolean, List<Employee>> partitioned =employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150));這將產生以下結果:
{false=[Bob], true=[Alice, Charles, Dorothy]}您還可以通過將groupingBy收集器傳遞給partitioningBy收集器來組合分區和分組。 例如,您可以計算每個分區內每個城市的雇員人數:
Map<Boolean, Map<String, Long>> result =employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150,groupingBy(Employee::getCity, counting())));這將產生一個兩層的Map:
{false={London=1}, true={New York=1, Hong Kong=1, London=1}}翻譯自: https://www.javacodegeeks.com/2015/11/java-8-streams-api-grouping-partitioning-stream.html
java8 streams
總結
以上是生活随笔為你收集整理的java8 streams_Java 8 Streams API:对流进行分组和分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交桩是什么意思 什么是交桩
- 下一篇: couchbase_具有Couchbas