在Java开发中,集合处理是日常高频操作。传统的for循环遍历、筛选、转换不仅代码冗余,可读性也差。Java 8引入的Stream流(Stream API)能以声明式的方式处理集合,让代码更简洁、易维护。本文通过简单示例,带你快速上手Stream流的核心用法。
场景说明
假设我们有一个用户列表,需要完成三个常见操作:
- 筛选出年龄大于18岁的成年用户;
- 提取这些用户的姓名并拼接成字符串;
- 统计成年用户的数量。
传统循环实现
先看传统for循环的写法,感受一下冗余的代码:
import java.util.ArrayList;
import java.util.List;
// 定义用户实体类
class User {
private String name;
private int age;
// 构造方法
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class StreamDemo {
public static void main(String[] args) {
// 初始化用户列表
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 20));
userList.add(new User("李四", 17));
userList.add(new User("王五", 25));
userList.add(new User("赵六", 16));
// 传统方式:筛选成年用户、提取姓名、统计数量
List<String> adultNames = new ArrayList<>();
int adultCount = 0;
for (User user : userList) {
if (user.getAge() > 18) {
// 筛选条件
adultNames.add(user.getName()); // 提取姓名
adultCount++; // 统计数量
}
}
// 拼接姓名
String nameStr = String.join(", ", adultNames);
System.out.println("成年用户姓名:" + nameStr);
System.out.println("成年用户数量:" + adultCount);
}
}
Stream流实现
用Stream流重构后,代码更简洁,逻辑更清晰:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
// 复用上面的User实体类
public class StreamOptDemo {
public static void main(String[] args) {
// 初始化用户列表
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 20));
userList.add(new User("李四", 17));
userList.add(new User("王五", 25));
userList.add(new User("赵六", 16));
// Stream流方式:一站式完成筛选、转换、统计
// 1. 筛选成年用户并提取姓名
List<String> adultNames = userList.stream()
.filter(user -> user.getAge() > 18) // 筛选条件:年龄>18
.map(User::getName) // 提取姓名(方法引用)
.collect(Collectors.toList()); // 转换为List
// 2. 统计成年用户数量
long adultCount = userList.stream()
.filter(user -> user.getAge() > 18)
.count(); // 直接统计数量
// 3. 拼接姓名
String nameStr = adultNames.stream().collect(Collectors.joining(", "));
System.out.println("成年用户姓名:" + nameStr);
System.out.println("成年用户数量:" + adultCount);
}
}
代码解释
stream():将集合转换为Stream流,开启流式操作;filter():接收Lambda表达式作为筛选条件,只保留符合条件的元素;map():对元素进行转换,这里通过User::getName(方法引用)提取用户姓名;collect():将流转换为指定集合(如Collectors.toList())或拼接字符串(Collectors.joining());count():统计流中元素的数量,返回long类型。
运行结果
两种写法的运行结果一致:
成年用户姓名:张三, 王五
成年用户数量:2
总结
- Stream流以声明式编程替代传统命令式循环,代码更简洁、可读性更高;
- 核心方法
filter()(筛选)、map()(转换)、collect()(收集)是Stream流的高频用法; - Stream流支持链式调用,可一站式完成多步集合操作,减少中间变量的定义。
Stream流不仅能简化集合操作,还支持并行流(parallelStream())提升大数据量处理效率,是Java 8及以上版本必备的核心技能。