10 个 Java Stream 顶级技巧,大量简化代码!

举报
bug菌 发表于 2024/12/31 09:54:55 2024/12/31
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。@TOC ✨ 前言Java 8 中引入的 Stream API 是 Java 的一个重要里程碑,它为集合操作提供了更简洁、更强大的编程方式。相比传统的 for 循环,Stream API 不仅代码更优雅,还能提升代码的可读性和性能。在实际开发中,熟练使用 Strea...

🏆本文收录于「滚雪球学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. 获取子集:limitskip

场景 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.summingIntCollectors.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. 获取最大值和最小值:maxmin

场景: 找到年龄最大的用户。

传统代码:

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. 快速判断:allMatchanyMatchnoneMatch

场景 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-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。