最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中map和flatMap的區(qū)別舉例詳解

 更新時間:2023年10月31日 11:26:55   作者:LOVE?YOU  
這篇文章主要給大家介紹了關于Java中map和flatMap區(qū)別的相關資料,在Java中Stream接口有map()和flatmap()方法,兩者都有中間流操作,并返回另一個流作為方法輸出,需要的朋友可以參考下

一、map 和 flatMap 對應的源碼

① map方法

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

② flatMap方法

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

可以看到,不論是 map 還是 flatMap 方法,都是對以流的形式數(shù)據(jù)的處理,返回值同樣都是流形式數(shù)據(jù)的泛型。本質(zhì)一樣,都是 map 操作,但是不同點在于,flatMap 操作會比 map 多一個 flat 操作。 

"flat"單詞本意有平的、扁平的含義,在源碼中,我們對于 flatMap 方法中 API Note 有這樣一句話:"The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.",含義是:flatMap()操作的效果是對流的元素應用一對多轉(zhuǎn)換,然后將生成的元素展平為新的流。而 map 方法的返回是:返回由將給定函數(shù)應用于此流元素的結(jié)果組成的流。

說到這里可能還是會有些不太清晰,我們用代碼演示一下。

二、代碼演示

① 兩個類,一個 Library 類,一個 Book 類

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Library {
    private String name;
    private List<Book> book;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book {
    private String name;
    private String author;
    private Integer price;
}

② 測試類

public class StreamTest {
    public static void main(String[] args) {
        System.out.println("---------->存儲的圖書信息: ");
        System.out.println(initInfo());
        System.out.println("---------->測試map方法:");
        testMap();
        System.out.println("---------->測試flatMap方法:");
        testFlatMap();
    }
    private static void testMap() {
        initInfo().stream()
                .map(library -> library.getBook())
                .forEach(book -> System.out.println(book));
    }
 
    private static void testFlatMap() {
        initInfo().stream()
                .flatMap(library -> library.getBook().stream())
                .forEach(book -> System.out.println(book));
    }
 
    public static List<Library> initInfo() {
        Library library1 = new Library("新華圖書", null);
        Library library2 = new Library("大家圖書", null);
        Library library3 = new Library("瀚海圖書", null);
 
        Book book1 = new Book("西游記", "吳承恩", 49);
        Book book2 = new Book("水滸傳", "施耐庵", 57);
        Book book3 = new Book("三國演義", "羅貫中", 52);
        Book book4 = new Book("朝花夕拾", "魯迅", 30);
 
        List<Book> library1Book = new ArrayList<>();
        List<Book> library2Book = new ArrayList<>();
        List<Book> library3Book = new ArrayList<>();
 
        library1Book.add(book1);
        library1Book.add(book2);
 
        library2Book.add(book2);
        library2Book.add(book3);
 
        library3Book.add(book3);
        library3Book.add(book4);
 
        library1.setBook(library1Book);
        library2.setBook(library2Book);
        library3.setBook(library3Book);
 
        return new ArrayList<>(Arrays.asList(library1, library2, library3));
    }
}

③ 測試結(jié)果

我們可以看到利用 flatMap 方法后,流中的數(shù)據(jù)被展平,消除了List<Book>的層級解構(gòu),但是 map 中的數(shù)據(jù)仍然存在層級結(jié)構(gòu)。

map 方法流的中間過程

 flatMap 方法流的中間過程

可以清楚的看到,map 方法應用后是存在層級結(jié)構(gòu)的,返回的流是List<Book>組成的流,而 flatMap 中消除了List<Book>的層級結(jié)構(gòu),返回的流是 Book 組成的流。

附:相關問題

那我要是這種3層數(shù)據(jù)結(jié)構(gòu)呢?,怎么把它們展開轉(zhuǎn)化為大寫字母?

[ [ ['a', 'b'], ['c', 'd'] ], [ ['e', 'f'], ['g', 'h'] ] ]  ==>
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

很簡單,先flatMap展開兩層,然后map就好了。

val orgList: List<List<List<Char>>> = listOf(
  listOf(
    listOf('a', 'b'),
    listOf('c', 'd')
  ),
  listOf(
    listOf('e', 'f'),
    listOf('g', 'h')
  )
)

val transList = orgList.flatMap { outterList ->
    outterList.flatMap { innerList ->
       innerList.map { charStr ->
           charStr.uppercaseChar()
       }
  }
}

總結(jié):

當我們需要將具有層級結(jié)構(gòu)的數(shù)據(jù)展平時,也就是將多層數(shù)據(jù)轉(zhuǎn)換為單層數(shù)據(jù)操作時,我們可以使用 flatMap 方法。如果我們只是簡單的對流中的數(shù)據(jù)計算或者轉(zhuǎn)換時,可以使用 map 方法。

舉例:

① 使用 flatMap:[a,b,c,d,[e,f [g,h,i]]] 轉(zhuǎn)換為 [a,b,c,d,e,f,g,h,i]

② 使用 map: [1,2,3,4,5,6] 轉(zhuǎn)換為 [11,12,13,14,15,16]

③ 使用 map: [a,b,c] 轉(zhuǎn)換為 [A,B,C]

到此這篇關于Java中map和flatMap的區(qū)別的文章就介紹到這了,更多相關Java map和flatMap區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java如何實現(xiàn)獲取客戶端ip地址的示例代碼

    java如何實現(xiàn)獲取客戶端ip地址的示例代碼

    本文主要介紹了java如何實現(xiàn)獲取客戶端ip地址,主要包括java獲取客戶端ip地址工具類使用實例、應用技巧,文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springcloud?feign集成hystrix方式

    springcloud?feign集成hystrix方式

    這篇文章主要介紹了springcloud?feign集成hystrix方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 在SpringBoot中使用MongoDB的簡單場景案例

    在SpringBoot中使用MongoDB的簡單場景案例

    MongoDB 是一種非關系型數(shù)據(jù)庫,也被稱為 NoSQL 數(shù)據(jù)庫,它主要以文檔的形式存儲數(shù)據(jù),本文給大家介紹了在SpringBoot中使用MongoDB的簡單場景案例,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 基于python locust庫實現(xiàn)性能測試

    基于python locust庫實現(xiàn)性能測試

    這篇文章主要介紹了基于python locust庫實現(xiàn)性能測試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • JAVA獲取Image的三種方式

    JAVA獲取Image的三種方式

    這篇文章主要介紹了JAVA獲取Image的三種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot 多線程事務回滾的實現(xiàn)

    SpringBoot 多線程事務回滾的實現(xiàn)

    本文是基于springboot的@Async注解開啟多線程,并通過自定義注解和AOP實現(xiàn)的多線程事務,避免繁瑣的手動提交/回滾事務,感興趣的可以了解一下
    2024-02-02
  • 詳解Java的面向?qū)ο蠛兔嫦蜻^程

    詳解Java的面向?qū)ο蠛兔嫦蜻^程

    我們知道,Java是面向?qū)ο蟮木幊陶Z言,但是至今仍有不少同學還不太懂”面向?qū)ο蟆暗拇_切含義,今天這篇文章就帶大家真正地認識面向?qū)ο?,感興趣的同學可以跟著小編一起來學習
    2023-05-05
  • java list常用方法總結(jié)

    java list常用方法總結(jié)

    這篇文章主要介紹了java list常用方法總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • VS Code配置Java環(huán)境全過程

    VS Code配置Java環(huán)境全過程

    文章介紹了如何在VSCode中配置和運行Java項目,包括安裝JDK、配置環(huán)境變量、安裝VSCode插件、處理不同場景的Java項目運行以及常見優(yōu)化方法
    2026-02-02
  • java實現(xiàn)簡單聊天軟件

    java實現(xiàn)簡單聊天軟件

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的聊天軟件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

武宁县| 肇东市| 且末县| 金湖县| 葵青区| 石景山区| 蕲春县| 高要市| 石景山区| 平利县| 南召县| 南皮县| 明溪县| 安福县| 荥阳市| 社旗县| 寿光市| 洛阳市| 鹤山市| 洛浦县| 怀柔区| 辽宁省| 海宁市| 华坪县| 上饶市| 井研县| 新余市| 岳阳县| 河曲县| 大安市| 华容县| 汶上县| 正宁县| 喀喇沁旗| 都昌县| 沙洋县| 溧阳市| 泌阳县| 闽侯县| 光泽县| 随州市|