在 Java 8 中引入的 Stream
是一个非常强大的工具,它让我们可以以声明式的方式操作集合,提高代码的可读性和可维护性。本文将深入讲解 Java Stream 的常用操作及其实际使用场景,适合初学者到中级开发者学习使用。
在公司常常会有很多表,要对dto字段拼接,所以常常会用stream流
Stream
是 Java 中对集合对象功能的增强,它专注于对集合数据进行复杂操作,比如筛选、排序、映射、聚合等,并且可以链式调用,写出简洁优雅的代码。
注意:Stream 不会改变原始数据源,它会返回一个新的流或结果。
我们下面通过一个 User
类来演示常用用法:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private String gender;
}
假设我们有一个用户集合:
List users = Arrays.asList(
new User("Tom", 25, "Male"),
new User("Lucy", 19, "Female"),
new User("Jack", 30, "Male"),
new User("Lily", 22, "Female")
);
filter()
:过滤数据List filtered = users.stream()
.filter(user -> user.getAge() > 20)
.collect(Collectors.toList());
多个条件可以用逻辑运算符:
.filter(user -> user.getAge() > 20 && "Male".equals(user.getGender()))
map()
:数据映射或字段转换List names = users.stream()
.map(User::getName)
.collect(Collectors.toList());
修改对象内部字段:
List modified = users.stream()
.map(user -> {
user.setName(user.getName() + "_new");
return user;
}).collect(Collectors.toList());
sorted()
:排序按照年龄升序:
List sorted = users.stream()
.sorted(Comparator.comparing(User::getAge))
.collect(Collectors.toList());
按照年龄降序:
.sorted(Comparator.comparing(User::getAge).reversed())
limit()
与 skip()
:分页处理limit(n)
:取前 n 个元素
skip(n)
:跳过前 n 个元素
List limited = users.stream()
.skip(1)
.limit(2)
.collect(Collectors.toList());
collect()
:收集结果常用的收集器:
Collectors.toList()
Collectors.toSet()
Collectors.toMap(keyMapper, valueMapper)
Map nameAgeMap = users.stream()
.collect(Collectors.toMap(User::getName, User::getAge));
forEach()
:遍历users.forEach(user -> System.out.println(user.getName()));
和 stream().forEach()
的区别:
users.forEach
是集合的方法,遍历原始集合;
users.stream().forEach
是对流操作后的集合进行遍历。
anyMatch()
/ allMatch()
/ noneMatch()
boolean hasAdult = users.stream().anyMatch(user -> user.getAge() >= 18);
boolean allAdult = users.stream().allMatch(user -> user.getAge() >= 18);
boolean noneTeen = users.stream().noneMatch(user -> user.getAge() < 13);
count()
、min()
、max()
、reduce()
long count = users.stream().count();
Optional min = users.stream()
.min(Comparator.comparing(User::getAge));
方法 | 功能描述 |
---|---|
filter() |
过滤元素 |
map() |
元素映射/转换 |
sorted() |
排序 |
limit() |
获取前 n 条 |
skip() |
跳过前 n 条 |
forEach() |
遍历 |
collect() |
终端收集 |
toMap() |
转换为 Map |
anyMatch() |
是否有任意一个符合条件 |
allMatch() |
是否全部符合条件 |
noneMatch() |
是否全部不符合条件 |
count() |
统计数量 |
reduce() |
聚合操作 |
如果你觉得这篇文章有帮助,欢迎点赞、收藏、转发!