场景
为了更便捷的操作集合,java8 引入Stream核心特性,它提供了一种声明式处理数据集合的方式。
使用步骤
创建Stream
集合创建:List.stream()、Set.stream()
数组创建:Arrays.stream(array)
静态方法:Stream.of()、Stream.iterate()、Stream.generate()
中间操作
map() - 元素转换
java
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> doubled = numbers.stream()
.map(x -> x * 2)
.collect(Collectors.toList());
// 结果:[2, 4, 6]
filter() - 元素过滤
java
List<String> cities = Arrays.asList("北京", "上海", "广州", "深圳");
List<String> filtered = cities.stream()
.filter(city -> city.startsWith("北"))
.collect(Collectors.toList());
// 结果:["北京"]:ml-citation{ref="5" data="citationList"}
groupingBy()分组操作
1. 字段分组
java
List<User> users = Arrays.asList(
new User("张三", "技术部"),
new User("李四", "技术部"),
new User("王五", "市场部")
);
Map<String, List<User>> deptGroup = users.stream()
.collect(Collectors.groupingBy(User::getDepartment));
// 结果:{"技术部": [张三, 李四], "市场部": [王五]}
2. 分组计数
java
Map<String, Long> deptCount = users.stream()
.collect(Collectors.groupingBy(User::getDepartment, Collectors.counting()));
// 结果:{"技术部": 2, "市场部": 1}
去重操作
1. 基本类型去重
java
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 1);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
// 结果:[1, 2, 3]
2. 对象属性去重
java
// 方法一:使用 distinct() + 重写 equals/hashCode
List<User> distinctUsers = users.stream()
.distinct()
.collect(Collectors.toList());
// 方法二:使用 TreeSet(推荐)
List<User> distinctByName = users.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(User::getName)))),
ArrayList::new));
终结操作
collect() - 结果收集
java
// List 转 Map
List<User> users = Arrays.asList(new User(1, "张三"), new User(2, "李四"));
Map<Integer, String> userMap = users.stream()
.collect(Collectors.toMap(User::getId, User::getName));
统计操作
java
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
long count = nums.stream().count(); // 元素个数:5
int sum = nums.stream().mapToInt(i -> i).sum(); // 求和:15
Optional<Integer> max = nums.stream().max(Integer::compare); // 最大值:5