国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java8 Stream流的合并

這篇具有很好參考價(jià)值的文章主要介紹了Java8 Stream流的合并。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近的需求里有這樣一個(gè)場景,要校驗(yàn)一個(gè)集合中每個(gè)對象的多個(gè)Id的有效性。比如一個(gè)Customer對象,有3個(gè)Id:id1,id2,id3,要把這些Id全部取出來,然后去數(shù)據(jù)庫里查詢它們是否存在。

@Data
public class Customer {
    private String name;
    private String id1;
    private String id2;
    private String id3;
}

通常情況下,我們都是從集合中取出對象的某一個(gè)字段,像這樣:

List<String> id1s =
    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

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

flatMap方法讓你把一個(gè)流中的每個(gè)值都換成另一個(gè)流,然后把所有的流連接起來成為一個(gè)流。

Stream.flatMap方法的入?yún)橐粋€(gè)Function函數(shù),函數(shù)返回值的泛型要求為Stream類型。對比來看,mapflatMap都是將流中的元素映射為我們想要的值,只是flatMap把流中元素映射為一個(gè)新的Stream。

Stream.of(T... values)方法將多個(gè)元素構(gòu)建成一個(gè)流,相當(dāng)于Arrays.stream方法,元素本身為Stream時(shí)就可以構(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());

上面的代碼就相當(dāng)于,Stream.of(stream, stream, stream), 得到的結(jié)果就是Stream<Stream>,而flatMap要將元素映射為Stream,所以flatMap中的Lambda表達(dá)式返回本身即可,然后把多個(gè)流合成一個(gè)新流。

加深印象

再舉一個(gè)例子,假設(shè)有這樣一個(gè)需求:有一個(gè)由逗號連接的字符串組成的數(shù)組,如{"1,2,3", "3,4,5"},要求合并為一個(gè)數(shù)組,并去重,如{"1", "2", "3", "4", "5"}

public static void main(String[] args) {
    String[] strArray = {"1,2,3", "3,4,5"};
    List<String> collect = Arrays.stream(strArray) // Stream<String>
            .map(str -> str.split(",")) // Stream<String[]>
            .flatMap(Arrays::stream) // Stream<String>
            .distinct()
            .collect(Collectors.toList());
    System.out.println(collect);
}

map函數(shù)將元素映射為一個(gè)數(shù)組,flatMap函數(shù)再將元素映射為一個(gè)Stream,并將所有Stream合并成一個(gè)新Stream,然后就能愉快操作流中的每個(gè)元素了。文章來源地址http://www.zghlxwxcb.cn/news/detail-434478.html

到了這里,關(guān)于Java8 Stream流的合并的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java——Stream流的學(xué)習(xí)

    Java——Stream流的學(xué)習(xí)

    在開發(fā)過程中,經(jīng)常或忽略流的使用,導(dǎo)致用的不熟練,于是抽時(shí)間系統(tǒng)的學(xué)習(xí)下stream的使用,找了嗶哩嗶哩的教程跟著看看練練。 創(chuàng)建Book、Aurhor實(shí)體類,初始化數(shù)據(jù) filter 對流中的操作進(jìn)行過濾,符合條件的返回 使用的函數(shù)式接口是:Predicate,參數(shù)是一個(gè)實(shí)體,擁有抽象

    2024年02月20日
    瀏覽(43)
  • Java——Stream流的peek方法

    Java Stream中的peek()方法也是用于查看每個(gè)元素,但不改變流的操作的方法。它接收一個(gè)Consumer類型的參數(shù),該參數(shù)用于針對每個(gè)元素執(zhí)行副作用操作。該方法返回一個(gè)與原始流相同的新流,因此可以進(jìn)行鏈?zhǔn)讲僮鳌?使用peek()方法可以方便地在流處理過程中調(diào)試或記錄某些數(shù)據(jù)

    2024年01月20日
    瀏覽(31)
  • Java中stream流的常見用法

    這篇文章主要是記錄stream流的用法,因?yàn)閟tream流比較常用,并且一些操作較復(fù)雜,記錄在此,以后參考。 1、filter用法 主要是用來過濾集合中的元素,較常用。 2、peek用法 主要是用來修改元素的狀態(tài),比如其中對象的字段等 3、map用法 主要是用來替換集合中的元素 4、flatma

    2024年02月12日
    瀏覽(30)
  • Java,SpringBoot中對Stream流的運(yùn)用

    詳細(xì)參考:java 1.8 stream 應(yīng)用-22種案例_java1.8 流案例-CSDN博客 1. 遍歷 ?2. 匯總

    2024年02月22日
    瀏覽(25)
  • Java8中Stream詳細(xì)用法大全

    Java8中Stream詳細(xì)用法大全

    Java 8 是一個(gè)非常成功的版本,這個(gè)版本新增的Stream,配合同版本出現(xiàn)的Lambda ,給我們操作集合(Collection)提供了極大的便利。Stream流是JDK8新增的成員,允許以聲明性方式處理數(shù)據(jù)集合,可以把Stream流看作是遍歷數(shù)據(jù)集合的一個(gè)高級迭代器。Stream 是 Java8 中處理集合的關(guān)鍵抽

    2023年04月08日
    瀏覽(31)
  • Java8 函數(shù)式編程stream流

    Java 8 中新增的特性旨在幫助程序員寫出更好的代碼,其中對核心類庫的改進(jìn)是很關(guān)鍵的一部分,也是本章的主要內(nèi)容。對核心類庫的改進(jìn)主要包括集合類的 API 和新引入的流(Stream),流使程序員得以站在更高的抽象層次上對集合進(jìn)行操作。下面將介紹stream流的用法。 ?場景

    2024年02月15日
    瀏覽(20)
  • Java8 Stream 之groupingBy 分組講解

    本文主要講解:Java 8 Stream之Collectors.groupingBy()分組示例 Collectors.groupingBy() 分組之常見用法 功能代碼: /** ?? ? * 使用java8 stream groupingBy操作,按城市分組list ?? ? */ ?? ?public void groupingByCity() { ?? ??? ?MapString, ListEmployee map = employees.stream().collect(Collectors.groupingBy(Employee::getCi

    2024年02月13日
    瀏覽(25)
  • Java8 Stream流處理樹形結(jié)構(gòu)數(shù)據(jù)

    參考資料 Java8新特性-使用Stream流遞歸實(shí)現(xiàn)遍歷樹形結(jié)構(gòu) ID為2,6,11的Menu 是 ID為1的Menu子節(jié)點(diǎn) ID為3,4,5的Menu 是 ID為2的Menu子節(jié)點(diǎn) ?? 注意 是下面這種寫法的一種更簡單的寫法

    2024年02月01日
    瀏覽(21)
  • Java8的stream之groupingBy()分組排序

    Java8的stream之groupingBy()分組排序

    groupingBy()是Stream API中最強(qiáng)大的收集器Collector之一,提供與SQL的GROUP BY子句類似的功能。 需要指定一個(gè)屬性才能使用,通過該屬性執(zhí)行分組。我們通過提供功能接口的實(shí)現(xiàn)來實(shí)現(xiàn)這一點(diǎn) - 通常通過傳遞lambda表達(dá)式。 TreeMap默認(rèn)按照key升序排序,collectPlan.descendingMap()可以進(jìn)行降序排

    2024年02月12日
    瀏覽(24)
  • java8 Stream流常用方法(持續(xù)更新中...)

    java8 Stream流常用方法(持續(xù)更新中...)

    操作對象 模擬數(shù)據(jù) 操作 打印結(jié)果 打印結(jié)果 注意:異常自己捕捉,就比如這里String轉(zhuǎn)Intger就可能出現(xiàn)NumberFormatException異常 打印結(jié)果 打印結(jié)果 斷點(diǎn)查看 打印結(jié)果 斷點(diǎn)查看 持續(xù)更新中…

    2024年04月28日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包