java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Stream流常用方法

Java Stream流常用方法实战指南

作者:madao哦

Stream流是Java 8中的一个新特性,它提供了一种处理集合和数组的方式,Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据,这篇文章主要介绍了Java Stream流常用方法的相关资料,需要的朋友可以参考下

前言

在 Java 8 引入的众多特性中,Stream API 无疑是最能提升代码优雅度和开发效率的工具之一。它让我们能以声明式的方式处理数据集合(类似于 SQL 语句),告别了繁琐的 for 循环和复杂的逻辑判断。

本文将基于实战角度,带你全面掌握 Stream 流的创建中间操作终结操作以及方法引用的高级用法。

一、 不可变集合

在开始学习 Stream 之前,了解 JDK 9+ 引入的不可变集合工厂方法非常有用,它们常被用来快速创建测试数据。

// 示例
List<String> list = List.of("张三", "李四", "王五");
Set<String> set = Set.of("A", "B", "C");
Map<String, Integer> map = Map.of("张三", 18, "李四", 20);

二、 第一步:获取 Stream 流

Stream 流的生命周期始于“数据源”。不同的数据结构获取流的方式略有不同。

1. 单列集合 (List, Set)

直接调用集合的 .stream() 方法。

ArrayList<String> list = new ArrayList<>();
Stream<String> stream = list.stream();

2. 双列集合 (Map)

Map 本身不能直接获取流,需要先将其转换为单列集合(KeySet 或 EntrySet)后再获取。

HashMap<String, Integer> map = new HashMap<>();

// 1. 对键获取流
Stream<String> keyStream = map.keySet().stream();

// 2. 对键值对获取流 (常用)
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

3. 数组

使用 Arrays 工具类的静态方法。

int[] arr = {1, 2, 3};
IntStream stream = Arrays.stream(arr); 

4. 零散数据

使用 Stream.of() 静态方法。

注意:如果传入的是基本数据类型的数组(如 int[]),Stream.of 会把整个数组当成一个元素(即传递的是地址);引用类型数组则会正常展开。

Stream<Integer> stream = Stream.of(1, 2, 3, 4);

三、 第二步:Stream 中间方法 (Intermediate Operations)

中间方法具有惰性求值的特点:它们不会立即执行,只有当遇到“终结方法”时,整个流水线才会启动。

核心规则

Stream 流只能使用一次,复用会报错,建议使用链式编程

中间操作不会修改原集合的数据。

1. 筛选与切片

2. 组合 (Concat)

3. 映射 (Map & FlatMap)

4. 排序 (Sorted)

5. 调试 (Peek)

四、 第三步:Stream 终结方法 (Terminal Operations)

终结方法是流操作的最后一步,调用后流即关闭,无法再次使用。

1. 遍历与统计

2. 查找与匹配

3. 数组转换

4. 归约 (Reduce)

5. 收集 (Collect)

这是最常用的终结方法,将流转变为集合或其他数据结构。

五、 进阶:方法引用 (Method References)

当 Lambda 表达式体中仅仅是调用一个已存在的方法时,可以使用方法引用 :: 来简化代码,使代码更具可读性。

1. 静态方法引用

格式:ClassName::staticMethod

// Lambda: s -> Integer.parseInt(s)
// 引用:   Integer::parseInt
list.stream().map(Integer::parseInt).collect(Collectors.toList());

2. 实例方法引用

格式:object::instanceMethod (对象名::成员方法)

StringBuilder sb = new StringBuilder();
// Lambda: s -> sb.append(s)
// 引用:   sb::append
list.stream().forEach(sb::append);

3. 特定类型的任意对象的实例方法引用

格式:ClassName::method 适用场景:Lambda 的第一个参数是方法的调用者,后面的参数是方法的形参。

List<String> words = Arrays.asList("apple", "banana");

// Lambda: (s) -> s.length()  --> 相当于调用 "apple".length()
// 引用:   String::length
List<Integer> lengths = words.stream()
    .map(String::length)
    .collect(Collectors.toList());

4. 构造方法引用

格式:ClassName::new

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

// Lambda: name -> new Person(name)
// 引用:   Person::new
List<Person> people = names.stream()
    .map(Person::new)
    .collect(Collectors.toList());

六、 总结

Java Stream API 的核心流程可以概括为: 数据源 (Source) -> 中间操作 (Intermediate) -> 终结操作 (Terminal)

到此这篇关于Java Stream流常用方法实战指南的文章就介绍到这了,更多相关Java Stream流常用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文