当前位置:   article > 正文

map 和 flatMap 的区别

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 方法,都是对以流的形式数据的处理,返回值同样都是流形式数据的泛型。本质一样,都是 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 类

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @EqualsAndHashCode
  5. public class Library {
  6. private String name;
  7. private List<Book> book;
  8. }
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @EqualsAndHashCode
  5. public class Book {
  6. private String name;
  7. private String author;
  8. private Integer price;
  9. }

② 测试类

  1. public class StreamTest {
  2. public static void main(String[] args) {
  3. System.out.println("---------->存储的图书信息: ");
  4. System.out.println(initInfo());
  5. System.out.println("---------->测试map方法:");
  6. testMap();
  7. System.out.println("---------->测试flatMap方法:");
  8. testFlatMap();
  9. }
  10. private static void testMap() {
  11. initInfo().stream()
  12. .map(library -> library.getBook())
  13. .forEach(book -> System.out.println(book));
  14. }
  15. private static void testFlatMap() {
  16. initInfo().stream()
  17. .flatMap(library -> library.getBook().stream())
  18. .forEach(book -> System.out.println(book));
  19. }
  20. public static List<Library> initInfo() {
  21. Library library1 = new Library("新华图书", null);
  22. Library library2 = new Library("大家图书", null);
  23. Library library3 = new Library("瀚海图书", null);
  24. Book book1 = new Book("西游记", "吴承恩", 49);
  25. Book book2 = new Book("水浒传", "施耐庵", 57);
  26. Book book3 = new Book("三国演义", "罗贯中", 52);
  27. Book book4 = new Book("朝花夕拾", "鲁迅", 30);
  28. List<Book> library1Book = new ArrayList<>();
  29. List<Book> library2Book = new ArrayList<>();
  30. List<Book> library3Book = new ArrayList<>();
  31. library1Book.add(book1);
  32. library1Book.add(book2);
  33. library2Book.add(book2);
  34. library2Book.add(book3);
  35. library3Book.add(book3);
  36. library3Book.add(book4);
  37. library1.setBook(library1Book);
  38. library2.setBook(library2Book);
  39. library3.setBook(library3Book);
  40. return new ArrayList<>(Arrays.asList(library1, library2, library3));
  41. }
  42. }

③ 测试结果

我们可以看到利用 flatMap 方法后,流中的数据被展平,消除了List<Book>的层级解构,但是 map 中的数据仍然存在层级结构。

map 方法流的中间过程

 flatMap 方法流的中间过程

可以清楚的看到,map 方法应用后是存在层级结构的,返回的流是List<Book>组成的流,而 flatMap 中消除了List<Book>的层级结构,返回的流是 Book 组成的流。

总结:

当我们需要将具有层级结构的数据展平时,也就是将多层数据转换为单层数据操作时,我们可以使用 flatMap 方法。如果我们只是简单的对流中的数据计算或者转换时,可以使用 map 方法。

举例:

① 使用 flatMap:[a,b,c,d,[e,f [g,h,i]]] 转换为 [a,b,c,d,e,f,g,h,i]

② 使用 map: [1,2,3,4,5,6] 转换为 [11,12,13,14,15,16]

③ 使用 map: [a,b,c] 转换为 [A,B,C]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/194345
推荐阅读
相关标签
  

闽ICP备14008679号