您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java Stream 的使用技巧

时间:2023-10-25 14:27:34  来源:今日头条  作者:知识创富老七

JAVA Stream API 就像 Java 开发人员最常用的武器,它用途广泛、结构紧凑,可以轻松处理各种任务。

它为开发人员提供了一种功能性和声明性的方式来表达复杂的数据转换和操作,使代码更加简洁、更具表现力。
但是,能力越大责任越大,有效使用流 API 需要对最佳实践常见陷阱有扎实的了解。
今天,我们将探讨使用 Java Stream API 的一些最佳实践,并向您展示如何充分释放这一神奇工具的潜力。
无论您是初学者还是经验丰富的开发人员,您都一定能在使用 Java 流的过程中学到一些令人兴奋的新知识。

 

使用原始数据流,提高性能

在处理 int、long 和 double 等基本类型时,应使用 IntStream、LongStream 和 DoubleStream 等基元流,而不是 Integer、Long 和 Double 等盒装类型流。原始数据流可以避免装箱和拆箱的代价,从而提供更好的性能。

var array = new int[]{1, 2, 3, 4, 5};
var sum = Arrays.stream(array)
               .sum();

避免嵌套流

最佳实践是避免嵌套流,因为它可能导致代码难以阅读和理解。相反,尝试将问题分解为更小的部分,并使用中间集合或局部变量来存储中间结果。

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());

谨慎使用并行流

并行流可以在处理大量数据时提供更好的性能,但它们也会引入开销和竞争条件。谨慎使用并行流,并考虑数据大小、操作复杂性和可用处理器数量等因素。

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

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

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

var list = Arrays.asList(1, 2, 3, 4, 5);
var result = list.stream()
                 .filter(n -> n > 3)
                 .findFirst();

避免副作用

Stream API 旨在对数据执行功能操作。避免引入副作用,例如修改流外部的变量或执行 I/O 操作,因为这可能会导致不可预测的行为并降低代码可读性。

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

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

Stream API 最适合不可变对象。使用不可变对象可确保流的状态在处理过程中不会被修改,这可以带来更可预测的行为和更好的代码可读性。

var list = Arrays.asList("apple", "banana", "cherry");
var result = list.stream()
                 .map(String::toUpperCase)
                 .collect(Collectors.toList());

在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());

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

与使用 lambda 表达式相比,方法引用可以使您的代码更加简洁和可读。如果可以使用方法引用代替 lambda 表达式,那么更喜欢它。

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

使用distinct()删除重复项

如果您的数据流可能包含重复元素,那么使用distinct() 方法来去重,删除它们

var list = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
var distinctList = list.stream()
                       .distinct()
                       .collect(Collectors.toList());

谨慎使用sorted()

Sorted() 操作可能会开销很大,尤其是对于数据量很大的流。不到万不得已请不要使用。如果您知道输入数据已经排序,则可以跳过此操作。

var list = Arrays.asList(3, 2, 1);
var sortedList = list.stream()
                     .sorted()
                     .collect(Collectors.toList());

Java Stream API 很强大而且很灵活,用得好能够显着简化数据处理任务的代码,大大提高我们的开发效率。同时也是一把双刃剑,尽量保证避开一些坑。



Tags:Java Stream   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Java Stream 的使用技巧
Java Stream API 就像 Java 开发人员最常用的武器,它用途广泛、结构紧凑,可以轻松处理各种任务。它为开发人员提供了一种功能性和声明性的方式来表达复杂的数据转换和操作,使代...【详细内容】
2023-10-25  Search: Java Stream  点击:(116)  评论:(0)  加入收藏
再聊Java Stream的一些实战技能与注意点
在此前我的文章中,曾分2篇详细探讨了下JAVA中Stream流的相关操作,2篇文章在掘金社区收获了累计 10w+阅读、2k+点赞以及 5k+收藏的记录。能够得到众多小伙伴的认可,是技术分享过...【详细内容】
2023-09-13  Search: Java Stream  点击:(408)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(14)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(19)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(24)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(55)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(68)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(72)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(88)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(105)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(95)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(74)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条