欢迎来到之路教程(on itroad-com)

Stream flatMap() 方法

方法语法

Stream flatMap()方法具有以下语法。

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
  • R表示新流的元素类型。
  • mapper是一个无干扰、无状态的函数,适用于产生新值流的每个元素。
  • 该方法返回一个新的 R 类型对象流。

Stream接口有另外三个类似的方法,它们在 flatMap()操作之后分别产生 IntStreamLongStreamDoubleStream
如果在 flatMap()操作之后创建的流返回给定类型以上,则考虑直接使用这些函数。

IntStream flatMapToInt(Function<? super T,? extends IntStream> mapper)
LongStream flatMapToLong(Function<? super T,? extends LongStream> mapper)
DoubleStream flatMapToDouble(Function<? super T,? extends DoubleStream> mapper)

说明

  • flatMap()是一个中间操作,返回另一个流作为方法输出返回值。
  • 它返回一个流,其中包含将给定流的每个元素替换为通过将提供的映射函数应用于每个元素而产生的映射流的内容的结果。
  • flatMap()中用于转换的 mapper函数是一个无状态函数,它只返回一个新值流。
  • 每个映射流在其内容放入新流后关闭。
  • flatMap()操作使流变平;与不应用展平的map()操作相反。
Java 8 Stream flatMap() 方法

Java 8 Stream flatMap() 方法用于将集合流扁平化为对象流。
这些对象是从原始 Stream 中的所有集合组合而成的。

flatMap() 操作的作用是对流的元素应用一对多转换,然后将结果元素展平为新的流。

Stream.flatMap()有助于将 Stream&lt;Collection&lt;T&gt;>转换为 Stream&lt;T>

什么是扁平化(Flattening)?

在非常外行的术语中,扁平化被称为将多个集合/数组合并为一个。

在给定的示例中,我们有一个包含 3 个数组的数组。
在扁平化之后,我们将有一个结果数组,其中所有项目都在三个数组中。

扁平化之前	: [[1, 2, 3], [4, 5], [6, 7, 8]]
扁平化之后	: [1, 2, 3, 4, 5, 6, 7, 8]

在以下示例中,lines是文件中的行流。
每行由多个单词组成。
words流是所有流的增肥版本,由所有行中的所有单词组成的单个流。

Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));
Java Stream flatMap() 示例

将嵌套列表转换为列表

Stream.flatMap() 函数示例,用于获取包含列表列表中所有元素的单个“列表”。

该程序使用 flatMap()操作将 List&lt;List&lt;Integer&gt;>转换为 List&lt;Integer>

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main 
{
    public static void main(String[] args) 
    {
    	List<Integer> list1 = Arrays.asList(1,2,3);
    	List<Integer> list2 = Arrays.asList(4,5,6);
    	List<Integer> list3 = Arrays.asList(7,8,9);

        List<List<Integer>> listOfLists = Arrays.asList(list1, list2, list3);

        List<Integer> listOfAllIntegers = listOfLists.stream()
        					.flatMap(x -> x.stream())
        					.collect(Collectors.toList());

        System.out.println(listOfAllIntegers);
    }
}

将字符串嵌套列表转换为单个列表:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main 
{
    public static void main(String[] args) 
    {
    	String[][] dataArray = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}, {"g", "h"}};

        List<String> listOfAllChars = Arrays.stream(dataArray)
        							.flatMap(x -> Arrays.stream(x))
        							.collect(Collectors.toList());

        System.out.println(listOfAllChars);
    }
}
日期:2020-09-17 00:10:07 来源:oir作者:oir