1. 程式人生 > >JAVA 8 Stream API 對Stream進行分組、分割槽

JAVA 8 Stream API 對Stream進行分組、分割槽

這篇文章展示瞭如何使用 Streams API 中的 Collector 及 groupingBy 和 partitioningBy 來對流中的元素進行分組和分割槽。

思考一下 Employee 物件流,每個物件對應一個名字、城市和銷售數量,如下表所示:

+----------+------------+-----------------+
| Name     | City       | Number of Sales |
+----------+------------+-----------------+
| Alice    | London     | 200             |
| Bob      | London     | 150             |
| Charles  | New York   | 160             |
| Dorothy  | Hong Kong  | 190             |
+----------+------------+-----------------+

分組

首先,我們利用(lambda表示式出現之前的)命令式風格Java 程式對流中的僱員按城市進行分組:

1 2 3 4 5 6 7 8 9 10 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 收集器,一條語句就能完成相同的功能,像這樣:

1 2 Map<String, List<Employee>> employeesByCity = employees.stream().collect(groupingBy(Employee::getCity));

結果如下面的 map 所示:

1 {New York=[Charles], Hong Kong=[Dorothy], London=[Alice, Bob]}

還可以計算每個城市中僱員的數量,只需傳遞一個計數收集器給 groupingBy 收集器。第二個收集器的作用是在流分類的同一個組中對每個元素進行遞迴操作。

1 2 Map<String, Long> numEmployeesByCity = employees.stream().collect(groupingBy(Employee::getCity, counting()));

結果如下面的 map 所示:

1 {New York=1, Hong Kong=1, London=2}

順便提一下,該功能與下面的 SQL 語句是等同的:

1 select city, count(*) from Employee group by city

另一個例子是計算每個城市的平均年齡,這可以聯合使用 averagingInt 和 groupingBy 收集器:

1 2 3 Map<String, Double> avgSalesByCity = employees.stream().collect(groupingBy(Employee::getCity, averagingInt(Employee::getNumSales)));

結果如下 map 所示:

1 {New York=160.0, Hong Kong=190.0, London=175.0}

分割槽

分割槽是一種特殊的分組,結果 map 至少包含兩個不同的分組——一個true,一個false。例如,如果想找出最優秀的員工,你可以將所有僱員分為兩組,一組銷售量大於 N,另一組小於 N,使用 partitioningBy 收集器:

1 2 Map<Boolean, List<Employee>> partitioned = employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150));

輸出如下結果:

1 {false=[Bob], true=[Alice, Charles, Dorothy]}

你也可以將 groupingBy 收集器傳遞給 partitioningBy 收集器來將聯合使用分割槽和分組。例如,你可以統計每個分割槽中的每個城市的僱員人數:

1 2 3 Map<Boolean, Map<String, Long>> result = employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150, groupingBy(Employee::getCity, counting())));

這樣會生成一個二級 Map:

相關推薦

JAVA 8 Stream API Stream進行分組分割槽

這篇文章展示瞭如何使用 Streams API 中的 Collector 及 groupingBy 和 partitioningBy 來對流中的元素進行分組和分割槽。 思考一下 Employee 物件流,每個物件對應一個名字、城市和銷售數量,如下表所示: +------

使用 FileSystem JAVA API HDFS 進行刪除等操作

Below is a code sample of how to read from and write to HDFS in java.  1. Creating a configuration object:  To be able to read from or write to HDFS,

使用Java8 Stream APIMap按鍵或值進行排序

一、什麼是Java 8 Stream 使用Java 8 Streams,我們可以按鍵和按值對對映進行排序。下面是它的工作原理: 將Map或List等集合類物件轉換為Stream物件 使用Streams的sorted()方法對其進行排序 最終將其返回為LinkedHashMap(可以保留排序順序) so

java 8 新特性之Stream的排序/分類

  Stream簡介 Stream是Java8提供的一個新的API,它位於java.util.stream包下。Stream API提供了一種新的方式來對Java集合進行操作,這種操作方式極大的提高了Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的程式碼。我們可以將元素集合看作一

跟我學 Java 8 新特性之 Stream 流(四)並行流

隨著對流API認識的慢慢深入,本章我們要討論的知識點是流API裡面的並行流了。 在開始討論並行流之前,我先引發一下大家的思考,就你看到這篇文章的時間,你們是不是經常聽到,Intel i7 CPU什麼8核16執行緒,什麼Android手機8核4GB這種訊息,既然我們是處於

跟我學 Java 8 新特性之 Stream 流(三)縮減操作

和前面兩篇文章一起服用,效果會更佳。通過對流API的基礎體驗Demo和關鍵知識點的講解,相信大家對流API都有一定的認識了,但是流API強大的功能,可不僅僅像前面兩篇文章中說的那樣簡單,大家應該注意到,在第二篇中,我對Stream介面進行介紹的時候,並沒有把他的全部方法都

跟我學 Java 8 新特性之 Stream 流(二)關鍵知識點

我們的第一篇文章,主要是通過一個Demo,讓大家體驗了一下使用流API的那種酣暢淋漓的感覺。如果你沒有實踐,我還是再次呼籲你動手敲一敲,自己實實在跑一遍上一篇的Demo。 相信你的感受和理解也會隨之加深的。繼續探索流API的高階功能之前,我們先從介面級別全面瞭解一下流A

跟我學 Java 8 新特性之 Stream 流基礎體驗

Java8新增的功能中,要數lambda表示式和流API最為重要了.這篇文章主要介紹流API的基礎,也是流API系列的第一篇文章,話不多說,直奔主題. 什麼是流API? 它能做一些什麼? 我們應該知道(絕對知道~)API是一個程式向使用者提供的一些方法,通過這些方法就

跟我學 Java 8 新特性之 Stream 流(六)收集

我們前面的五篇文章基本都是在說將一個集合轉成一個流,然後對流進行操作,其實這種操作是最多的,但有時候我們也是需要從流中收集起一些元素,並以集合的方式返回,我們把這種反向操作稱為收集。 流API也給我們提供了相應的方法。 如何在流中使用收集功能? 我們先看一看流API

跟我學 Java 8 新特性之 Stream 流(七)流與迭代器,流系列大結局

恭喜你們,馬上就要學完Java8 Stream流的一整系列了,其實我相信Stream流對很多使用Java的同學來說,都是一個知識盲點,因為這個原因,我才這麼細緻地講解Stream流的各個知識點,通過這一整個系列,我相信只要認真看了的同學,都已掌握的差不多了,就差實戰了。

Java 8 Lambda表示式與Stream 流結合使用

使用Lambdas和Streams Stream是對集合的包裝,通常和lambda一起使用。 使用lambdas可以支援許多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 同樣,Stream

Java 8程式設計進階-Stream之函數語言程式設計

1、什麼是Stream       Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。Stream API可以極大提

呼叫JAVA API HDFS 進行檔案的讀取寫入上傳下載刪除等操作

Hadoop檔案系統 基本的檔案系統命令操作, 通過hadoop fs -help可以獲取所有的命令的詳細幫助檔案。 Java抽象類org.apache.hadoop.fs.FileSystem定義了hadoop的一個檔案系統介面。該類是一個抽象類,通過以下兩種靜態工廠方法

JAVAmap進行分組

public static Map<String, List<Map<String, Object>>

8.4Solr API使用(Result Grouping分組查詢)

src adding offset resp iteye status jpg pan border 轉載請出自出處:http://eksliang.iteye.com/blog/2169458 一、概述 分組統計查詢不同於分組統計(Facet),facet只是簡單統計記錄

[C#] List進行分組排序後輸出

pos 學生 new C# src key 輸出 分組 groupby Student 類: public class Student { public int ID { get; set; } public string

8.使用hydra進行爆破

如果對開啟埠的服務不清楚,請看我之前寫的文章:https://www.cnblogs.com/bmjoker/p/8833316.html 2018,網站的防護(sql,xss...)的安全保護也已經上升了一個等級,但是由於管理員的安全意識薄弱,網站弱口令漏洞依然猖獗,不信可以看補天的漏洞提交記錄,弱口令依

在使用pandas 0.23.4日期進行分組排序時報錯

date_df["rank_num"] = date_df.groupby("issuer_id").report_date.agg("rank", **{"ascending": 1, "method": "min"}) File "D:\python_virtualenv\es_env\

java 8 日期API

Java 8 中的日期API 相比以前更為簡潔,辨識度高,而且都是執行緒安全的。掌握常用的時間類方法有時可以節省許多額外的工作。關於各個類的介紹可以參考Java 8新特性(四):新的時間和日期API 值得注意的是,LocalTime 、LocalDate與Loc

Solr13 - 通過SolrCloud的RESTful API叢集進行增刪改查操作

文章目錄 1 建立操作 1.1 建立collection 1.2 建立core 1.3 建立API引數說明 2 刪除操作 2.1 刪除collection 2.2 解除安裝core 2.3 刪