java8 stream的这些开发技巧,你值得好好收藏

Wesley13
• 阅读 568
  • 如果有些朋友以前没有使用过java8 stream这种链式编程方式做开发,想学习一下。

  • 如果有些朋友只学习了一部分用法,想学习更多。

  • 如果有些朋友想看看有没有好的示例适用于实际工作当中。

那么恭喜你,这篇文章非常适合你。

首先,我们一起看看stream的继承关系:

java8 stream的这些开发技巧,你值得好好收藏 stream的继承关系

Stream、IntStream、LongStream、DoubleStream的父接口都是BaseStream。BaseStream的四个子接口方法都差不多,只是IntStream、LongStream、DoubleStream直接存储基本类型,可以避免自动装/拆箱,效率会更高一些。但是,我们实际上使用Stream更多一些。

我们再看看stream的工作流程图:

java8 stream的这些开发技巧,你值得好好收藏 stream的工作流程图

为什么要学stream的链式编程方式

业务需求1:指定一个字符串数组,找出里面相同的元素,并且统计重复的次数。

我们以前大概是这样做的:

public class CountTest {

执行结果:

key:a value:3

我们再看看如果用java8的stream可以怎么做:

public class CountTest {

执行结果:

key:a value:3

我们可以看到testCount1和testCount2执行结果相同,仅仅一行代码:Map<String, Long> countMap = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 就可以实现上面testCount1中多行代码的逻辑。

业务需求2:从一个指定的字符串数组中,查找指定的字符串是否存在

我们以前大概是这样做的:

public class FindTest {

我们再看看如果用java8的stream可以怎么做:

public class MatchTest {

我们可以看到调用testFind1和testFind2方法执行结果也是一样的。但是,用java8 stream的语法,又只用一行代码就完成功能了,真棒。

java8 stream超详细用法指南

stream的操作符大体上分为两种:中间操作符终止操作符

中间操作:

1.filter(T-> boolean)

过滤数据,保留 boolean 为 true 的元素,返回一个集合

public class FilterTest {

collect(Collectors.toList())可以把流转换为 List 类型,collect实际上是一个终止操作。

2.map(T -> R)

转换操作符,可以做数据转换,比如:把字符串转换成int、long、double,或者把一个实体转换成另外一个实体。包含:map,mapToInt、mapToLong、mapToDouble

public class MapTest {

3.flatMap(T -> Stream)

将流 中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流

public class FlatMapTest {

我们可以看到flatMap可以轻松把字符串的二维数据变成一位数组。

4.distinct

去重,类似于msql中的distinct的作用,底层使用了equals方法做比较。

public class DistinctTest {

其实,去重还有另外一种办法,可以用Collectors.toSet(),后面会讲到。

5.sorted

对元素进行排序,前提是实现Comparable接口,当然也可以自定义比较器。

public class SortTest {

6.limit

限流操作,有点类似于mysql中的limit功能,比如:有10个元素,只取前面3个元素

public class LimitTest {

7.skip

跳过操作,比如:有个10个元素,从第5个元素开始去后面的元素

public class SkipTest {

8.peek

挑出 操作,

public class PeekTest {

眼尖的朋友会发现,进行x.toUpperCase()转换为大写功能,但是实际上没有生效。把peek改成map方法试试:

public class PeekTest {

我们可以看到,用map操作转换成大写功能生效了,但是用peek操作却没有生效。peek只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素。

终止操作:

**1.**forEach

遍历操作,包含:forEach 和 forEachOrdered

forEach:支持并行处理

forEachOrdered:是按顺序处理的,遍历速度较慢

public class ForEachTest {

2.collect

收集操作,将所有的元素收集起来,Collectors 提供了非常多收集器。包含:toMap、toSet、toList、joining,groupingBy,maxBy,minBy等操作。

toMap:将数据流转换为map,里面包含的元素是用key/value的形式的

toSet:将数据流转换为set,里面包含的元素不可重复

toList:将数据流转出为list,里面包含的元素是有序的

joining:拼接字符串

groupingBy:分组,可以将list转换map

couting:统计元素数量

maxBy:获取最大元素

minBy:获取最小元素

summarizingInt: 汇总int类型的元素,返回IntSummaryStatistics,再调用具体的方法对元素进行统计:getCount(统计数量),getSum(求和),getMin(获取最小值),getMax(获取最大值),getAverage(获取平均值)

summarizingLong:汇总long类型的元素,用法同summarizingInt

summarizingDouble:汇总double类型的元素,用法同summarizingInt

averagingInt:获取int类型的元素的平均值,返回一个double类型的数据

averagingLong:获取long类型的元素的平均值,用法同averagingInt

averagingDouble:获取double类型的元素的平均值,用法同averagingInt

mapping:获取映射,可以将原始元素的一部分内容作为一个新元素返回

public class CollectTest {

3.find

查找操作,包含:findFirst、findAny

findFirst:找到第一个,返回的类型为Optional

findAny:使用 stream() 时找到的是第一个元素,使用 parallelStream() 并行时找到的是其中一个元素,返回的类型为Optional

public class FindOpTest {

4.match

匹配操作,包含:allMatch、anyMatch、noneMatch

allMatch:所有元素都满足条件,返回boolean类型

anyMatch:任意一个元素满足条件,返回boolean类型

noneMatch:所有元素都不满足条件,返回boolean类型

public class MatchTest {

5.count

统计操作,效果跟调用集合的size()方法类似

public class CountOpTest {

6.min、max

min:获取最小值,返回Optional类型的数据

max:获取最大值,返回Optional类型的数据

public class MaxMinTest {

7.reduce

规约操作,将整个数据流的值规约为一个值,count、min、max底层就是使用reduce。

reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。

public class ReduceTest {

8.toArray

数组操作,将数据流的元素转换成数组。

public class ArrayTest {

stream和parallelStream的区别

stream:是单管道称其为流,其主要用于集合的逻辑处理。

parallelStream:是多管道,提供了流的并行处理,它是Stream的另一重要特性,其底层使用Fork/Join框架实现

public class StreamTest {

public class ParallelStreamTest {

我们可以看到直接使用parallelStream的forEach遍历数据,是没有顺序的。

如果要让parallelStream遍历时有顺序怎么办呢?

public class ParallelStreamTest {

parallelStream的工作原理:

java8 stream的这些开发技巧,你值得好好收藏

实际工作中的案例

1.从两个集合中找相同的元素。一般用于批量数据导入的场景,先查询出数据,再批量新增或修改。

public class WorkTest {

2.有两个集合a和b,过滤出集合a中有,但是集合b中没有的元素。这种情况可以使用在假如指定一个id集合,根据id集合从数据库中查询出数据集合,再根据id集合过滤出数据集合中不存在的id,这些id就是需要新增的。

    @Test

3.根据条件过滤数据,并且去重做数据转换

    @AllArgsConstructor

4.统计指定集合中,姓名相同的人中年龄最小的年龄

    @Test

         大家喜欢这篇文章的话,请关注一下 :苏三说技术

java8 stream的这些开发技巧,你值得好好收藏

本文分享自微信公众号 - 苏三说技术(gh_9f551dfec941)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
3年前
几个有点意思的 CSS 技巧
如果你是一名前端开发人员或者想成为一名开发人员,那么,我今天与你分享的9个CSS技巧,你需要知道一下。现在,我们开始吧。1、学习盒子模型你在学习CSS时,应该避免使用Bootstrap或TailwindCSS等框架,这些工具非常适合构建漂亮的网站,但如果你还不能正确的了解CSS,则建议不要使用这些框架中的任何一个。因为如果你使用了这些工具,你将无法学习
Aidan075 Aidan075
3年前
2021最全Python入门学习路线
我将在这里带大家快速入门Python,本公众号会专注于Python爬虫、数据分析、数据可视化、办公自动化、Web开发等等然后接下来会给大家一些学习路线(思维导图),方便大家找到适合自己的学习方向。无论你打算做什么,只要是和Python相关的,这个学习路线绝对都是好用的。但我特别不希望有些朋友一上来就学习numpy、pandas、matplotlib相
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java编程学习入门
java编程学习入门    自java出来之后,就被很多人欢迎,虽然开始的时候有点麻烦,但是发展到现在很多人企业都在使用java做一些应用,包括了一些政府部门,因此java工程师需求也越来越大了。那么下面小编给大家说说java编程学习入门,希望能对你有些帮助。    java编程学习入门    首先肯定要明白自己为什么学习
Easter79 Easter79
3年前
Struts和Hibernate的简单示例
最近给一个非常好学却找不到方向的朋友讲struts和hibernate框架的基础入门,突然发现自己对这两个框架有些生疏了。这一年来的工作中都没有使用过struts和hibernate做开发,所以在给他讲解的同时也是自己复习和加深印象的过程,有些技术细节确实需要用心记忆。今天去面试,收获了3点感想:1.在学习技术的过程中,博学是好事,但专精更
Wesley13 Wesley13
3年前
Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号“程序新视界”,好好系列的学习一下Java8的新特性。Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了。现在进入正题Java8的Lambda,首先看一下发音
Stella981 Stella981
3年前
Spring Boot 最核心的 3 个注解详解
最近面试一些Java开发者,他们其中有些在公司实际用过SpringBoot,有些是自己兴趣爱好在业余自己学习过。然而,当我问他们SpringBoot最核心的3个注解是什么,令我失望的是鲜有人能答上来,这样你能说你对SpringBoot很了解吗?这可能还会给你减分!你所需具备的基础什么是Sprin
Wesley13 Wesley13
3年前
5点改善你的编程逻辑
编程逻辑是成为优秀开发人员的关键。也许,根据您的工作地点,您将使用更多算法。如果你是一名网页设计师,你可能不打算处理复杂的算法,但如果你是前端开发人员,可能会处理一些算法,如果你是一个后端开发人员,你会经常处理复杂算法。在这里,我将向您介绍5个点,_在我看来_,这些点有资源来改进我们的编程逻辑。本文适合所有人,如果我们设法开发出一个好的逻辑,我们
Stella981 Stella981
3年前
JS(javascript)在自动化测试项目中的应用【软件测试开发入门教程】
有朋友反映最近我写的东西太难了,太高级了。比如说我今天分享的主题是javascript在自动化测试中的应用有些朋友说我之前讲的自动化测试的东西,需要消化很久,有一定的难度,意思就是说我动不动就讲测试框架,测试开发是不是会有这样的感觉?比如今天分享的javascript,大家做软件测试有没有用过?或者在自动化测试中应用过可能很多朋友java
AGIC.TWang AGIC.TWang
1星期前
如何写出好的大模型提示词?如何判断提示词的好坏?
如果把大语言模型比作一个超级聪明但有点迷糊的朋友,那么提示词就是你与他沟通的桥梁。如何让这个“朋友”理解你的意图并给出满意的答案,取决于你如何构建这些提示。如果提示模糊不清,AI的回答可能就会像一团乱麻,让人无从下手。因此,掌握有效的提示词撰写技巧显得尤为重要。