Java8實(shí)現(xiàn)Stream流的合并的方法展示
最近的需求里有這樣一個(gè)場(chǎng)景,要校驗(yàn)一個(gè)集合中每個(gè)對(duì)象的多個(gè)Id的有效性。比如一個(gè)Customer對(duì)象,有3個(gè)Id:id1,id2,id3,要把這些Id全部取出來,然后去數(shù)據(jù)庫里查詢它是否存在。
@Data
@AllArgsConstructor
public class Customer {
private String name;
private String id1;
private String id2;
private String id3;
}在通常情況下,我們要從集合中取出一個(gè)對(duì)象屬性,很好辦,用這個(gè)辦法:
customerList.stream().map(Customer::getId1).filter(Objects::nonNull).collect(Collectors.toList())
現(xiàn)在要取3個(gè)字段,怎么做呢?
Stream.concat
Stream接口中的靜態(tài)方法concat,可以把兩個(gè)流合成一個(gè),我們?nèi)?個(gè)字段可以合并兩次:
Stream<String> concat = Stream.concat(customerList.stream().map(Customer::getId1),
customerList.stream().map(Customer::getId2));
List<String> ids = Stream.concat(concat, customerList.stream().map(Customer::getId3))
.filter(Objects::nonNull)
.collect(Collectors.toList());取4個(gè)字段,就再繼續(xù)合并。但是這種不夠簡潔,可以使用扁平化流flatMap。
flatMap
flatmap方法讓你把一個(gè)流中的每個(gè)值都換成另一個(gè)流,然后把所有的流連接起來成為一個(gè)流。
Stream.flatMap方法的入?yún)橐粋€(gè)Function函數(shù),函數(shù)返回值的泛型要求為Stream類型。對(duì)比一下,map和flatMap都是將流中的元素映射為我們想要的值,只是flatMap映射的結(jié)果是一個(gè)新的Stream。
而Stream.of方法剛好可以構(gòu)建一個(gè)類型為Stream的原始流,以供flatMap操作。
List<String> ids = Stream.of(customerList.stream().map(Customer::getId1),
customerList.stream().map(Customer::getId2),
customerList.stream().map(Customer::getId3))
.flatMap(idStream -> idStream)
.filter(Objects::nonNull)
.collect(Collectors.toList());注意,Stream.of方法返回的流的泛型跟方法入?yún)⒌念愋褪且粯?,上面的代碼就相當(dāng)于,Stream.of(stream, stream, stream), 得到的結(jié)果就是Stream<Stream>,緊接著用flatMap扁平化處理,把每一個(gè)元素合成一個(gè)新流。
Java8中的Stream流提供了多種合并方法,可以方便地將多個(gè)Stream流合并成一個(gè)。其中,concat()方法適用于兩個(gè)Stream流的合并,flatMap()方法適用于將一個(gè)Stream流中的元素映射成多個(gè)Stream流并合并成一個(gè),reduce()方法適用于將Stream流中的元素逐個(gè)合并成一個(gè)結(jié)果。在實(shí)際開發(fā)中,可以根據(jù)具體需求選擇不同的合并方法,提高代碼的可讀性和效率。
到此這篇關(guān)于Java8實(shí)現(xiàn)Stream流的合并的方法展示的文章就介紹到這了,更多相關(guān)Java8 Stream流的合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解
這篇文章主要介紹了Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類和 BigDecimal(大浮點(diǎn)數(shù))類用于大數(shù)運(yùn)算,這兩個(gè)類都繼承自 Number 類(抽象類),由于 BigInteger 在大數(shù)運(yùn)算中更常見,需要的朋友可以參考下2023-09-09
Maven修改運(yùn)行環(huán)境配置代碼實(shí)例
這篇文章主要介紹了Maven修改運(yùn)行環(huán)境配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java日期工具類操作字符串Date和LocalDate互轉(zhuǎn)
這篇文章主要介紹了Java日期工具類操作字符串Date和LocalDate互轉(zhuǎn),文章首先通過需要先引入坐標(biāo)展開主題的相關(guān)內(nèi)容介紹,需要的朋友可以參一下2022-06-06
SpringBoot項(xiàng)目啟動(dòng)健康檢查的操作方法
在現(xiàn)代的微服務(wù)架構(gòu)中,容器化技術(shù)已經(jīng)成為一種主流的部署方式,Docker 作為容器化技術(shù)的代表,提供了一種輕量級(jí)、可移植的解決方案,然而,僅僅將應(yīng)用容器化是不夠的,我們還需要確保這些容器在運(yùn)行時(shí)能夠保持健康狀態(tài),這就是健康檢查發(fā)揮作用的地方2024-12-12
Spring?Security實(shí)現(xiàn)添加圖片驗(yàn)證功能
這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)添加圖片驗(yàn)證功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫操作
這篇文章主要介紹了JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫操作,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)javaweb的小伙伴們有很大的幫助,需要的朋友可以參考下2021-04-04
Java基于Swing實(shí)現(xiàn)的打獵射擊游戲代碼
這篇文章主要介紹了Java基于Swing實(shí)現(xiàn)的打獵射擊游戲代碼,包含完整的游戲事件處理與邏輯流程控制,具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11

