Java中stream是什么?有什么作用?如何使用?

在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API。它提供了一种功能强大且表达力高的编程模型,可以用更简洁、更具可读性的方式处理数据。

Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理。使用Stream可以避免显式地使用迭代器或循环来操作集合,提高代码的可读性和简洁性。

以下是使用Stream的一般步骤:

  1. 获取一个数据源(如List、Set、数组等)。
  2. 调用stream()方法获取数据流。
  3. 使用各种中间操作对数据流进行处理(如筛选、转换等)。
  4. 调用终端操作执行对数据流的最终处理(如聚合、收集结果等)。

下面通过示例代码详细介绍Stream的使用:

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        // 1. 获取数据源
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 2. 获取数据流
        List<Integer> evenSquares = numbers.stream()
                // 3. 中间操作:筛选偶数并计算平方
                .filter(n -> n % 2 == 0)
                .map(n -> n * n)
                // 4. 终端操作:收集结果
                .collect(Collectors.toList());

        System.out.println(evenSquares); // 输出:[4, 16, 36, 64, 100]
    }
}

在上述示例中,我们首先获取了一个整数列表作为数据源。然后,通过调用stream()方法获取了一个数据流。接着,使用中间操作filter()筛选出偶数,再使用map()计算平方。最后,通过终端操作collect()将结果收集到列表中。

这只是Stream的基本用法,Stream还提供了丰富的中间操作和终端操作供使用,如sorted()distinct()reduce()等。通过组合不同的操作,可以实现复杂的数据处理逻辑。

stream用法:

  1. filter(Predicate<T> predicate):根据指定的条件筛选元素。
java 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]
  1. map(Function<T, R> mapper):将元素转换为另一种类型。
java 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<String> result = list.stream().map(n -> "Number: " + n).collect(Collectors.toList());
// 输出:["Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5"]
  1. flatMap(Function<T, Stream<R>> mapper):将流中的每个元素转换为一个流,然后将所有流合并为一个流。
java 复制代码
List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5));
List<Integer> result = lists.stream().flatMap(list -> list.stream()).collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
  1. distinct():去除流中重复的元素。
java 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 2, 4, 1, 5);
List<Integer> result = list.stream().distinct().collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
  1. sorted():对流中元素进行排序。
ini 复制代码
List<Integer> list = Arrays.asList(5, 3, 1, 2, 4);
List<Integer> result = list.stream().sorted().collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
  1. peek(Consumer<T> action):对流中的元素执行指定的操作。
java 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().peek(n -> System.out.println("Processing element: " + n)).collect(Collectors.toList());
// 输出:Processing element: 1 Processing element: 2 Processing element: 3 Processing element: 4 Processing element: 5
  1. limit(long maxSize):截取流中的前N个元素。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().limit(3).collect(Collectors.toList());
// 输出:[1, 2, 3]
  1. skip(long n):跳过流中的前N个元素。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().skip(3).collect(Collectors.toList());
// 输出:[4, 5]
  1. forEach(Consumer<T> action):对流中的每个元素执行指定的操作。
java 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(n -> System.out.println(n));
// 输出:1 2 3 4 5
  1. collect(Collector<T, A, R> collector):将流中的元素收集到一个容器中。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]
  1. count():返回流中的元素个数。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().count();
// 输出:5
  1. reduce(T identity, BinaryOperator<T> accumulator):将流中的元素逐个与初始值进行操作,返回最终结果。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);
// 输出:15
  1. findFirst()findAny():返回流中的第一个元素或任意一个元素。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> first = list.stream().findFirst();
Optional<Integer> any = list.stream().findAny();
// 输出:1
  1. max()min():返回流中的最大元素或最小元素。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = list.stream().max(Integer::compareTo);
Optional<Integer> min = list.stream().min(Integer::compareTo);
// 输出:5 1
  1. allMatch(Predicate<T> predicate)anyMatch(Predicate<T> predicate)noneMatch(Predicate<T> predicate):分别返回流中所有元素是否满足指定条件、是否至少有一个元素满足指定条件、是否没有元素满足指定条件。
ini 复制代码
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(n -> n > 0);
boolean anyMatch = list.stream().anyMatch(n -> n % 2 == 0);
boolean noneMatch = list.stream().noneMatch(n -> n > 5);
// 输出:true true false
相关推荐
老孙讲技术11 分钟前
集成商选型笔记:原生 OpenSDK(低延迟)vs Web 轻应用(7 天上线)怎么选
后端
大鸡腿同学24 分钟前
AI 智能剪辑
后端
运维行者_26 分钟前
广域网性能监控:分布式IT架构下的链路质量保障
开发语言·网络·分布式·后端·架构·数据库架构
灯澜忆梦31 分钟前
GO---map函数
开发语言·前端·后端·golang
QQ_216962909642 分钟前
【项目编号:project05966】SpringBoot/Vue 电影推荐系统:用户端推荐、电影资讯与后台数据管理全流程
vue.js·spring boot·后端
用户6757049885021 小时前
手摸手教你玩 Jenkins,一次搞懂 CI/CD!(第三章:发布之nodeAgent)
后端·jenkins
用户713874229001 小时前
深入 Claude Code 的 settings.json
后端
张三丰21 小时前
LEFT JOIN 到底什么时候会被优化器偷偷改写成 INNER JOIN
后端
SamDeepThinking1 小时前
一次线程池线上故障复盘:四层防线如何避免数据丢失
java·后端·程序员
用户40966601317511 小时前
MySQL 索引优化速查表:3 分钟定位慢查询根因
后端