stream.flatMap() 所有详情用法
时间: 2023-10-12 07:19:27 浏览: 72
`flatMap()` 是一个用于处理流的中间操作,它将一个元素流转换为另一个元素流。它接收一个函数作为参数,该函数将流中的每个元素映射为一个包含零个或多个元素的流,然后将这些流合并为一个单独的流。以下是 `flatMap()` 的详细用法:
1. `flatMap(Function<T, Stream<R>> mapper)`:将每个元素映射为一个流,并将这些流合并为一个单独的流。这个方法的参数是一个 `Function`,它接收一个元素并返回一个 `Stream`,这个 `Stream` 中包含了零个或多个元素。例如:
```java
List<String> words = Arrays.asList("Hello", "World");
List<String[]> letters = words.stream()
.map(word -> word.split(""))
.distinct()
.collect(Collectors.toList());
List<String> flatLetters = words.stream()
.flatMap(word -> Arrays.stream(word.split("")))
.distinct()
.collect(Collectors.toList());
```
在上面的例子中,我们将一个字符串流转换为一个字符串数组流,然后将这个流转换为一个字符串流。使用 `flatMap()` 可以将字符串数组流中的元素打平为一个单独的字符串流。
2. `flatMapToDouble(ToDoubleFunction<T> mapper)`:将每个元素映射为一个 `DoubleStream`,并将这些 `DoubleStream` 合并为一个单独的 `DoubleStream`。这个方法的参数是一个 `ToDoubleFunction`,它接收一个元素并返回一个 `double` 类型的值。例如:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
double sum = numbers.stream()
.flatMapToDouble(num -> DoubleStream.of(num * 0.5, num * 1.5))
.sum();
```
在上面的例子中,我们将一个整数流转换为一个 `DoubleStream`,然后将其中的每个元素乘以 0.5 和 1.5,最后将所有结果求和。
3. `flatMapToInt(ToIntFunction<T> mapper)`:将每个元素映射为一个 `IntStream`,并将这些 `IntStream` 合并为一个单独的 `IntStream`。这个方法的参数是一个 `ToIntFunction`,它接收一个元素并返回一个 `int` 类型的值。
4. `flatMapToLong(ToLongFunction<T> mapper)`:将每个元素映射为一个 `LongStream`,并将这些 `LongStream` 合并为一个单独的 `LongStream`。这个方法的参数是一个 `ToLongFunction`,它接收一个元素并返回一个 `long` 类型的值。
需要注意的是,`flatMap()` 方法返回的是一个新的流,因此它可以与其他流操作一起使用。同时,由于 `flatMap()` 方法会将多个流合并为一个流,因此它可能会影响性能。因此,在使用 `flatMap()` 方法时需要注意避免产生大量的中间流。
阅读全文