📅  最后修改于: 2023-12-03 15:23:24.108000             🧑  作者: Mango
在Java 8中,引入了Stream API来支持集合数据的函数式编程。flatMap()是Stream API的一个重要函数,它具有将一个流转换为另一个流的能力,可以将多个流合并成一个新的流,并提供更灵活的操作方式。
flatMap()方法定义如下:
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
flatMap()方法接收一个Function作为参数,这个Function接收一个流中的元素作为输入,返回一个流对象。flatMap()方法对流中的每个元素都执行该Function,并将所有返回的流合并成一个新的流返回。
下面是一个使用flatMap()方法将多个字符串流合并成一个新的流的例子:
List<String> list1 = Arrays.asList("Hello", "World");
List<String> list2 = Arrays.asList("My", "Name", "Is");
List<String> list3 = Arrays.asList("Alice", "Bob", "Carl");
List<List<String>> lists = Arrays.asList(list1, list2, list3);
Stream<String> stream = lists.stream().flatMap(Collection::stream);
以上代码中,我们首先定义了三个字符串列表list1、list2和list3,然后用Arrays.asList()将它们合并成一个列表lists。接下来通过调用flatMap()方法和Collection类的stream()方法将所有字符串流合并成一个新的流,最终结果是一个包含所有字符串的流。
除了合并流外,flatMap()方法还有其他常见的使用方式,例如,可以使用它来平铺嵌套的List:
List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6));
Stream<Integer> stream = lists.stream().flatMap(Collection::stream);
以上代码将嵌套的List铺平成了一个整体的流。
另一个示例是将流转换为数组:
String[] array = Stream.of("Hello", "World").flatMap(s -> Stream.of(s.split("")))
.toArray(String[]::new);
以上代码将字符串流先使用flatMap()方法拆分成单个字符的流,然后使用toArray()方法将单个字符流转换为字符数组。
flatMap()方法是Stream API中的一个重要函数,它提供了将多个流合并成一个新的流的能力,可以用于简化很多集合操作,并且可以提高代码的可读性和灵活性。熟练掌握flatMap()方法的使用,能够有效提高Java程序员的开发效率。