Java8 教程第十三章之Stream FlatMap

本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對的地方還請多多包涵。

本節(jié)課先簡單的介紹下Java8有哪些新特性,對于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.

經(jīng)過下面的小打小鬧終于迎來了一個重要的方法 FlatMap,當前方法與map函數(shù)不同.具體看下區(qū)別吧

在Java 8中,Stream可以包含不同的數(shù)據(jù)類型,例如:

Stream<String[]>    
Stream<Set<String>>    
Stream<List<String>>    
Stream<List<Object>>

但是,Stream操作(filter,sum,distinct ...)和收集器不支持它,因此,我們需要flatMap()來執(zhí)行以下轉換

{ {1,2}, {3,4}, {5,6} } -> flatMap -> {1,2,3,4,5,6}

{ {'a','b'}, {'c','d'}, {'e','f'} } -> flatMap -> {'a','b','c','d','e','f'}

當前用大白話解釋下, List<List<String>> 通過flatMap函數(shù)可以變?yōu)長ist<String>. 這樣說是不是通俗一點呢

Stream + String[] + flatMap

下面的示例將打印一個空結果,因為filter()不知道如何過濾String []流。

 public static void main(String[] args) {
        String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
        //Stream<String[]>
        Stream<String[]> temp = Arrays.stream(data);
        //filter a stream of string[], and return a string[]?
        Stream<String[]> stream = temp.filter(x -> "a".equals(Arrays.toString(x)));
        stream.forEach(System.out::println);
}

輸出

在上面的例子中,我們應該使用flatMap()將Stream <String []>轉換為Stream <String>

 public static void main(String[] args) {
        String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
        //Stream<String[]>
        Stream<String[]> temp = Arrays.stream(data);
        //Stream<String>!
        Stream<String> stringStream = temp.flatMap(Arrays::stream);
        Stream<String> stream = stringStream.filter("a"::equals);
        stream.forEach(System.out::println);
        /*stream = Arrays.stream(data)
                .flatMap(Arrays::stream)
                .filter("a"::equals);*/
    }

輸出

a

Stream + Set + flatMap

先實例一個Student對象

@Data
public class Student {

    private String name;
    private Set<String> book;
}

下面邏輯有兩個學生,我想得到兩個學生下所有的書籍,怎么做呢?

public static void main(String[] args) {

        Student obj1 = new Student();
        obj1.setName("PrimaryKey");
        obj1.addBook("Java8實戰(zhàn)");
        obj1.addBook("Spring Boot實戰(zhàn)");

        Student obj2 = new Student();
        obj2.setName("李白");
        obj2.addBook("Python實戰(zhàn)");
        obj2.addBook("java8實戰(zhàn)");
        List<Student> list = new ArrayList<>();
        list.add(obj1);
        list.add(obj2);
        List<String> collect = list.stream()
                        .map(Student::getBook)      //Stream<Set<String>>
                        .flatMap(Collection::stream)   //Stream<String>
                        .distinct()
                        .collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

輸出

Spring Boot實戰(zhàn)
Java8實戰(zhàn)
Python實戰(zhàn)

以上代碼.distinct() 函數(shù)為去重,其實同collect(Collectors.toSet())一樣效果

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容