文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

十个 Stream 技巧,优化 Java 代码

2024-11-29 18:22

关注

它为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。

但能力越大,责任越大,有效地使用Stream API需要对最佳实践和常见陷阱有深入的了解。

今天,我们将探讨使用Java Stream API的一些最佳实践,并展示如何释放这个神奇工具的全部潜力。

1. 使用原始流以获得更好的性能

使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能。

var array = new int[]{1, 2, 3, 4, 5};
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(1, 2, 3, 4, 5);
var sum = list.parallelStream().reduce(0, Integer::sum);

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

Stream API 支持延迟计算,这意味着在调用终端操作之前不会执行中间操作。作为最佳实践,尝试使用惰性计算来通过减少不必要的计算来提高性能。

var list = Arrays.asList(1, 2, 3, 4, 5);
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(1, 2, 3, 4, 5);
var filteredList = list.stream()
                       .filter(i -> i % 2 == 0)
                       .map(i -> i * 2)
                       .collect(Collectors.toList());

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

与使用 lambda 表达式相比,方法引用可以使我们的代码更加简洁和可读。在合适的情况下,优先使用方法引用代替 lambda 表达式。

var list = Arrays.asList(1, 2, 3, 4, 5);
var sum = list.stream()
              .reduce(0, Integer::sum);

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

如果你的流可能包含重复元素,请使用distinct() 操作来删除它们

var list = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
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 需要充分了解其功能和限制。

来源:一安未来内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯