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

点击上方 "程序架构之家" 关注公众号 设为星标 终身学习 技术干货 及时送达
Java Stream API对于 Java 开发人员来说就像一把瑞士军刀 — 它用途广泛、结构紧凑,并且可以轻松处理各种任务。它为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。但能力越大,责任越大,有效地使用Stream API需要对最佳实践和常见陷阱有深入的了解。今天,我们将探讨使用Java Stream API的一些最佳实践,并展示如何释放这个神奇工具的全部潜力。1. 使用原始流以获得更好的性能使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能。
var array = new int[]{12345};
var sum = Arrays.stream(array)
               .sum();


2. 避免嵌套流

最佳实践是避免嵌套流,因为它可能导致代码难以阅读和理解。相反,尝试将问题分解为更小的部分,并使用中间集合或局部变量来存储中间结果。
var list1 = Arrays.asList("apple""banana""cherry");
var list2 = Arrays.asList("orange""pineapple""mango");
var result = Stream.concat(list1.stream(), list2.stream())
                  .filter(s -> s.length() > 5)
                  .collect(Collectors.toList());


3. 谨慎使用并行流

并行流可以在处理大量数据时提供更好的性能,但它们也会引入开销和竞争条件。谨慎使用并行流,并考虑数据大小、操作复杂性和可用处理器数量等因素。
var list = Arrays.asList(12345);
var sum = list.parallelStream().reduce(0, Integer::sum);


4. 使用惰性求值以获得更好的性能

Stream API 支持延迟计算,这意味着在调用终端操作之前不会执行中间操作。作为最佳实践,尝试使用惰性计算来通过减少不必要的计算来提高性能。
var list = Arrays.asList(12345);
var result = list.stream()
                 .filter(n -> n > 3)
                 .findFirst();


5.避免副作用

Stream API 旨在对数据执行功能操作。避免引入副作用,例如修改流外部的变量或执行 I/O 操作,因为这可能会导致不可预测的行为并降低代码可读性。
var list = Arrays.asList("apple""banana""cherry");
var count = 0;
list.stream()
    .filter(s -> s.startsWith("a"))
    .forEach(s -> count++);


6. 将流与不可变对象一起使用

Stream API 最适合不可变对象。使用不可变对象可确保流的状态在处理过程中不会被修改,这可以带来更可预测的行为和更好的代码可读性
var list = Arrays.asList("apple""banana""cherry");
var result = list.stream()
                 .map(String::toUpperCase)
                 .collect(Collectors.toList());


7. 在map()之前使用filter()以避免不必要的处理

如果你的流可能包含大量不符合你的条件的元素,请在 map() 之前使用 filter() 以避免不必要的处理。这可以提高代码的性能。
var list = Arrays.asList(12345);
var filteredList = list.stream()
                       .filter(i -> i % 2 == 0)
                       .map(i -> i * 2)
                       .collect(Collectors.toList());


8. 优先选择方法引用而不是 lambda 表达式

与使用 lambda 表达式相比,方法引用可以使我们的代码更加简洁和可读。在合适的情况下,优先使用方法引用代替 lambda 表达式。
var list = Arrays.asList(12345);
var sum = list.stream()
              .reduce(0, Integer::sum);


9. 使用distinct()删除重复项

如果你的流可能包含重复元素,请使用distinct() 操作来删除它们
var list = Arrays.asList(1233455);
var distinctList = list.stream()
                       .distinct()
                       .collect(Collectors.toList());

10. 谨慎使用sorted()

Sorted() 操作可能会很昂贵,尤其是对于大型流。仅在必要时谨慎使用。如果你确定输入的数据已经排序,则可以跳过此操作。
var  list  = Arrays.asList( 3 , 2 , 1 ); 
var  SortedList  = list.stream() 
                     .sorted() 
                     .collect(Collectors.toList());
总之,Java Stream API 是一个强大而灵活的工具,可以显著简化数据处理任务的代码。通过遵循本文中讨论的提示,可以确保代码既高效又有效。但是,请务必记住,有效使用 Java Stream API 需要充分了解其功能和限制。不断学习和探索 Java Stream API 的世界,释放其全部潜力。

-End-

精彩推荐  1、Spring Cloud Stream整合Rabbit消费重试方案你知道几种?2、Stream在代码可读性和性能之间的抉择,你如何选?
3、你见过哪些目瞪口呆的 Java 代码技巧?4、感受 lambda 之美,看了都说好!
程序架构技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗,加我好友,拉你进群 

感谢家人们、兄弟们的关注与支持 🙏分享成长之路,不忘初心,惠泽他人 🌟与时俱进,终身学习,点赞关注不迷路 ✨

相关推荐

  • 为什么阿里巴巴修正了HashMap关于1024个元素扩容的次数?(典藏版)
  • 某女程序员失业半年,某央企答应给offer,本以为她已婚已孕,结果发现真相后......
  • 如何避免 PostgreSQL RDS 的陷阱:一份大数据解决方案的实践指南
  • 雷军:一定把小米汽车干好、干成;QQ测试AI聊天搭子,再战AI社交;零一万物宣布开源Yi-9B模型 | 极客头条
  • 竞赛中的一些花式Finetune方法。
  • CKA考试必备:解锁Pod封装多容器的高级技巧!
  • 阿里面试官: 说说你知道的移动端适配方式?
  • 生来取代Docker、JS,谷歌力推,这项技术发布7年后,现状如何?
  • 招商银行内推。。。
  • 聊聊MySQL的锁
  • 上来就对标 20k Star 的开源项目,是自不量力还是后起之秀?
  • 18.7 k 一款媲美飞书的团队协作利器,开源了!
  • Stable Diffusion 3论文终于发布,架构细节大揭秘,对复现Sora有帮助?
  • 院士委员:“破五唯”似乎越“破”越“唯”,“帽子”比以前更多了,建议将青年科技人员帽子和待遇脱钩,避免把人分为三六九等
  • [开源]MIT开源协议,一款完全开源免费且可商用的OA办公管理系统
  • AI太火,量子位今年更缺人了 (含实习)
  • 通报一起“AI人格觉醒”事件
  • 阿里领投Minimax 6亿美元融资,5家大模型独角兽集齐了
  • Stable Diffusion 3技术报告出炉:揭露Sora同款架构细节
  • Claude 3“自我认知”事件引爆,马斯克坐不住了,OpenAI被曝还有后手