Java8 教程第十三章之Stream FlatMap

本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。

本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.

经过下面的小打小闹终于迎来了一个重要的方法 FlatMap,当前方法与map函数不同.具体看下区别吧

在Java 8中,Stream可以包含不同的数据类型,例如:

Stream    
Stream>    
Stream>    
Stream>

但是,Stream操作(filter,sum,distinct ...)和收集器不支持它,因此,我们需要flatMap()来执行以下转换

{ {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> 通过flatMap函数可以变为List. 这样说是不是通俗一点呢

Stream + String[] + flatMap

下面的示例将打印一个空结果,因为filter()不知道如何过滤String []流。

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

输出

在上面的例子中,我们应该使用flatMap()将Stream 转换为Stream

 public static void main(String[] args) {
        String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
        //Stream
        Stream temp = Arrays.stream(data);
        //Stream!
        Stream stringStream = temp.flatMap(Arrays::stream);
        Stream 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 book;
}

下面逻辑有两个学生,我想得到两个学生下所有的书籍,怎么做呢?

public static void main(String[] args) {

        Student obj1 = new Student();
        obj1.setName("PrimaryKey");
        obj1.addBook("Java8实战");
        obj1.addBook("Spring Boot实战");

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

输出

Spring Boot实战
Java8实战
Python实战

以上代码.distinct() 函数为去重,其实同collect(Collectors.toSet())一样效果

你可能感兴趣的:(Java8 教程第十三章之Stream FlatMap)