日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java8 streams_Java 8 Streams API:对流进行分组和分区

發布時間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:对流进行分组和分区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。