10 个 Java Stream 顶级技巧,大量简化代码!
🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。
@TOC
✨ 前言
Java 8 中引入的 Stream API 是 Java 的一个重要里程碑,它为集合操作提供了更简洁、更强大的编程方式。相比传统的 for 循环,Stream API 不仅代码更优雅,还能提升代码的可读性和性能。在实际开发中,熟练使用 Stream API 可以显著提升你的编程效率。
今天,我们将分享 10 个 Java Stream 的顶级技巧,这些技巧能帮助你解决常见的集合操作问题,快速简化代码,提高开发效率。
📌 1. 过滤集合:filter
场景: 从一个用户列表中筛选出年龄大于 18 的用户。
传统代码:
List<User> adults = new ArrayList<>();
for (User user : users) {
if (user.getAge() > 18) {
adults.add(user);
}
}
Stream 简化代码:
List<User> adults = users.stream()
.filter(user -> user.getAge() > 18)
.collect(Collectors.toList());
📌 2. 转换集合:map
场景: 将用户对象列表转换为用户名字符串列表。
传统代码:
List<String> usernames = new ArrayList<>();
for (User user : users) {
usernames.add(user.getName());
}
Stream 简化代码:
List<String> usernames = users.stream()
.map(User::getName)
.collect(Collectors.toList());
📌 3. 排序集合:sorted
场景: 按用户的年龄升序排列。
传统代码:
users.sort(Comparator.comparingInt(User::getAge));
Stream 简化代码:
List<User> sortedUsers = users.stream()
.sorted(Comparator.comparingInt(User::getAge))
.collect(Collectors.toList());
倒序排列:
List<User> sortedUsers = users.stream()
.sorted(Comparator.comparingInt(User::getAge).reversed())
.collect(Collectors.toList());
📌 4. 去重:distinct
场景: 从列表中去除重复的字符串。
传统代码:
Set<String> uniqueItems = new HashSet<>(items);
List<String> uniqueList = new ArrayList<>(uniqueItems);
Stream 简化代码:
List<String> uniqueItems = items.stream()
.distinct()
.collect(Collectors.toList());
📌 5. 获取子集:limit
和 skip
场景 1: 获取前 3 个元素。
传统代码:
List<String> firstThree = new ArrayList<>();
for (int i = 0; i < 3 && i < items.size(); i++) {
firstThree.add(items.get(i));
}
Stream 简化代码:
List<String> firstThree = items.stream()
.limit(3)
.collect(Collectors.toList());
场景 2: 跳过前 3 个元素。
Stream 简化代码:
List<String> skippedItems = items.stream()
.skip(3)
.collect(Collectors.toList());
📌 6. 集合分组:Collectors.groupingBy
场景: 将用户按年龄分组。
传统代码:
Map<Integer, List<User>> groupedByAge = new HashMap<>();
for (User user : users) {
groupedByAge.computeIfAbsent(user.getAge(), k -> new ArrayList<>()).add(user);
}
Stream 简化代码:
Map<Integer, List<User>> groupedByAge = users.stream()
.collect(Collectors.groupingBy(User::getAge));
📌 7. 求和、求平均值:Collectors.summingInt
和 Collectors.averagingDouble
场景: 求用户年龄的总和和平均值。
传统代码:
int totalAge = 0;
for (User user : users) {
totalAge += user.getAge();
}
double averageAge = totalAge / (double) users.size();
Stream 简化代码:
int totalAge = users.stream()
.collect(Collectors.summingInt(User::getAge));
double averageAge = users.stream()
.collect(Collectors.averagingDouble(User::getAge));
📌 8. 获取最大值和最小值:max
和 min
场景: 找到年龄最大的用户。
传统代码:
User oldest = null;
for (User user : users) {
if (oldest == null || user.getAge() > oldest.getAge()) {
oldest = user;
}
}
Stream 简化代码:
Optional<User> oldest = users.stream()
.max(Comparator.comparingInt(User::getAge));
最小值:
Optional<User> youngest = users.stream()
.min(Comparator.comparingInt(User::getAge));
📌 9. 合并集合元素:Collectors.joining
场景: 将用户名列表拼接为逗号分隔的字符串。
传统代码:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < users.size(); i++) {
sb.append(users.get(i).getName());
if (i < users.size() - 1) sb.append(",");
}
String result = sb.toString();
Stream 简化代码:
String result = users.stream()
.map(User::getName)
.collect(Collectors.joining(","));
📌 10. 快速判断:allMatch
、anyMatch
、noneMatch
场景 1: 判断是否所有用户都大于 18 岁。
传统代码:
boolean allAdults = true;
for (User user : users) {
if (user.getAge() <= 18) {
allAdults = false;
break;
}
}
Stream 简化代码:
boolean allAdults = users.stream()
.allMatch(user -> user.getAge() > 18);
场景 2: 判断是否存在年龄小于 18 的用户。
Stream 简化代码:
boolean hasMinor = users.stream()
.anyMatch(user -> user.getAge() < 18);
场景 3: 判断是否所有用户都不是管理员。
Stream 简化代码:
boolean noAdmin = users.stream()
.noneMatch(user -> user.isAdmin());
🔮 高阶技巧:组合使用
Stream API 最强大的地方在于可以将多个操作组合起来,形成一条清晰的处理流水线。
场景:筛选年龄大于 18 的用户、按年龄排序,并返回前 5 个用户的用户名列表。
传统代码:
List<User> filteredUsers = new ArrayList<>();
for (User user : users) {
if (user.getAge() > 18) {
filteredUsers.add(user);
}
}
filteredUsers.sort(Comparator.comparingInt(User::getAge));
List<String> top5Names = new ArrayList<>();
for (int i = 0; i < Math.min(5, filteredUsers.size()); i++) {
top5Names.add(filteredUsers.get(i).getName());
}
Stream 简化代码:
List<String> top5Names = users.stream()
.filter(user -> user.getAge() > 18)
.sorted(Comparator.comparingInt(User::getAge))
.limit(5)
.map(User::getName)
.collect(Collectors.toList());
✨ 总结
Java Stream API 提供了一个简洁、高效的方式处理集合操作。从过滤、转换到分组、统计,每一个操作都能显著减少代码量并提升可读性。掌握这些技巧,不仅能帮助你写出更优雅的代码,还能让你的开发效率大幅提升。
如果你对 Java Stream API 有更多问题或独特的技巧,欢迎交流讨论!😊
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)