探索 Java 8 中的 Stream 流:构建流的多种方式

什么是 Stream 流?

在深入探讨如何构建 Stream 流之前,让我们先理解 Stream 是什么以及它为什么如此重要。

Stream 是 Java 8 引入的一种抽象的数据类型,它代表一个序列化的数据集合。Stream 不是一个数据结构,而是一种用于处理数据的工具,它允许你执行各种操作,例如过滤、映射、排序和聚合,以便提取所需的信息。Stream 的主要特点包括:

声明性: 使用 Stream,你可以告诉程序你要做什么,而不是怎么做。这使得代码更容易阅读和维护。
懒加载: Stream 操作不会立即执行,而是在需要的时候才进行计算。这可以提高性能,因为它避免了不必要的计算。
可并行化: Stream 操作可以自动并行执行,充分利用多核处理器的性能。

创建 Stream 流

Java 8 提供了多种方式来创建 Stream 流,以下是其中一些常见的方式。

1. 从集合创建 Stream

你可以使用集合类的 stream 方法或 parallelStream 方法来创建一个 Stream 流。这是使用 Stream 的最常见方式,因为你通常需要在已有的数据集合上执行操作。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// 从 List 创建 Stream
Stream<String> nameStream = names.stream();

// 从 Set 创建并行 Stream
Stream<String> parallelNameStream = new HashSet<>(names).parallelStream();

2. 从数组创建 Stream

你可以使用 Arrays.stream 方法来从数组创建 Stream。

int[] numbers = {1, 2, 3, 4, 5};

// 从数组创建 IntStream
IntStream numberStream = Arrays.stream(numbers);

3. 使用 Stream.of 创建 Stream

你可以使用 Stream.of 方法创建包含指定元素的 Stream。

Stream<String> stream = Stream.of("Apple", "Banana", "Cherry");

4. 使用 Stream.generate 创建 Stream

你可以使用 Stream.generate 方法创建一个无限流,通过传入一个 Supplier 函数来生成流中的元素。

Stream<String> infiniteStream = Stream.generate(() -> "Hello, World!");

这将创建一个无限包含 “Hello, World!” 的 Stream。你可以使用 limit 方法来限制流的大小。

Stream<String> limitedStream = Stream.generate(() -> "Hello, World!").limit(5);

5. 使用 Stream.iterate 创建 Stream

你可以使用 Stream.iterate 方法创建一个包含迭代元素的 Stream。你需要提供一个初始元素和一个 UnaryOperator 函数,该函数定义了如何生成下一个元素。

Stream<Integer> numbers = Stream.iterate(0, n -> n + 2);

这将创建一个包含偶数的无限流。同样,你可以使用 limit 方法来限制流的大小。

Stream<Integer> limitedNumbers = Stream.iterate(0, n -> n + 2).limit(10);

Stream 流的操作

一旦你创建了一个 Stream,你可以对其执行各种操作。以下是一些常见的操作:

1. 过滤数据

你可以使用 filter 方法来过滤流中的元素。例如,如果你有一个包含数字的流,你可以过滤出所有的偶数。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

List<Integer

> evenNumbers = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());

// 输出:[2, 4, 6, 8, 10]
System.out.println(evenNumbers);

2. 映射数据

你可以使用 map 方法来对流中的每个元素执行一个函数,并将结果收集到一个新的流中。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

List<Integer> nameLengths = names.stream()
    .map(String::length) // 映射为字符串长度
    .collect(Collectors.toList());

// 输出:[5, 3, 7]
System.out.println(nameLengths);

3. 排序数据

你可以使用 sorted 方法对流中的元素进行排序。

List<String> fruits = Arrays.asList("Banana", "Apple", "Cherry");

List<String> sortedFruits = fruits.stream()
    .sorted()
    .collect(Collectors.toList());

// 输出:[Apple, Banana, Cherry]
System.out.println(sortedFruits);

4. 聚合数据

你可以使用各种聚合操作,如 reduceminmaxcount 等,来汇总流中的元素。

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);

int sum = numbers.stream()
    .reduce(0, Integer::sum);

long count = numbers.stream()
    .count();

// 输出:sum = 38, count = 11
System.out.println("sum = " + sum + ", count = " + count);

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-l1Bpr7o9-1720110504826)]

[外链图片转存中…(img-Td6EOCBW-1720110504826)]

2021企业Java面试题精选

[外链图片转存中…(img-tEpvZEQS-1720110504827)]

[外链图片转存中…(img-lfjW1WFU-1720110504827)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值