Stream 流的创建

Stream 的创建方式有多种,可以通过集合、数组、值、函数等来创建 Stream。常见的创建方式有:

  • 通过集合创建 Stream:Collection.stream()Collection.parallelStream()

  • 通过数组创建 Stream:Arrays.stream(T array)Stream.of()

  • 通过值创建 Stream:Stream.of(T... values)

  • 通过函数创建 Stream:创建无限流Stream.generate(Supplier s)、创建无限流Stream.iterate(T seed, UnaryOperator f)

List<String> list = Arrays.asList("apple", "banana", "orange", "pear", "strawberry");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);

上面的代码中,通过list.stream()方法可以创建一个 Stream 对象,然后通过forEach方法遍历输出。

Stream 转换为其他数据类型

既然 Stream 可以从集合、数组、值、函数等创建,那么也可以将 Stream 转换为其他数据类型。常见的转换方式有:

  • Stream 转换为数组:stream.toArray()

  • Stream 转换为 List:stream.collect(Collectors.toList())

  • Stream 转换为 Set:stream.collect(Collectors.toSet())

  • Stream 转换为 Map:stream.collect(Collectors.toMap())

  • Stream 转换为 String:stream.collect(Collectors.joining())

  • Stream 转换为 Collection:stream.collect(Collectors.toCollection())

Stream 配合 Collectors 工具类使用时,可以实现更多的转换操作。

// Stream 转换为数组
String[] arr = stream.toArray(String[]::new);

Stream 对基本数据类型的支持

Stream 只能引用数据类型,不能直接操作基本数据类型。为了解决这个问题,Stream API 提供了对基本数据类型的支持,分别是IntStreamLongStreamDoubleStream。这三种 Stream 对应于基本数据类型intlongdouble。这样可以避免自动装箱和拆箱操作,提高性能。

IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
// 生成 0 到 100 的数字
IntStream.range(0, 100).forEach(System.out::println);
// 生成 0 到 100(包含 100)的数字
IntStream.rangeClosed(0, 100).forEach(System.out::println);
// 求和
int sum = intStream.sum();

最后更新于

这有帮助吗?