可以看到,不论是 map 还是 flatMap 方法,都是对以流的情势数据的处理,返回值同样都是流情势数据的泛型。本质一样,都是 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()操纵的结果是对流的元素应用一对多转换,然后将天生的元素展平为新的流。而 map 方法的返回是:返回由将给定函数应用于此流元素的结果组成的流。
说到这里可能还是会有些不太清楚,我们用代码演示一下。
二、代码演示
① 两个类,一个 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));