常用技术-Stream流

目录

Stream流是什么?

认识Stream流

流和集合的区别

Stream流的操作

中间操作

Filter(过滤)

Map(转换)

Sorted(排序)

Distinct(去重)

Limit(限制)

Skip(跳过)

Peek(展示)

终止操作

forEach(循环)

Collect(收集)

 Count(计数)

 Reduce(聚合)

使用Stream流的优缺点:

优点:

缺点: 


​​​​​​

Stream流是什么?

认识Stream流

Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响

同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是惰性取值,只有等到用户真正需要结果的时候才会执行。

Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。

流和集合的区别

  • 不存储数据。流是基于数据源的对象,它本身不存储数据元素,而是通过管道将数据源的元素传递给操作。

  • 函数式编程。流的操作不会修改数据源,例如filter不会将数据源中的数据删除

  • 延迟操作。流的很多操作如filter,map等中间操作是延迟执行的,只有到终点操作才会将操作顺序执行。

  • 可以解绑。对于无限数量的流,有些操作是可以在有限的时间完成的,比如limit(n) 或 findFirst(),这些操作可是实现”短路”(Short-circuiting),访问到有限的元素后就可以返回。

  • 纯消费。   流的元素只能访问一次,类似Iterator,操作没有回头路,如果你想从头重新访问流的元素,对不起,你得重新生成一个新的流。

集合讲的是数据,流讲的是计算

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性

Stream流的操作

中间操作

中间操作是返回一个新的流,并在返回的流中包含所有之前的操作结果。它们总是延迟计算,这意味着它们只会在终止操作时执行,这样可以最大限度地优化资源使用。

Filter(过滤)

 filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。简单理解就是传入一个lambad表达式,去筛选过滤,返回满足条件的集合元素

Map(转换)

官方解析:返回由给定函数应用于此流的元素的结果组成的流。

说人话就是对当前集合每一个元素进行操作,返回一个新的流

解析:参数传入一个lambad表达式 ,其中item表示一个集合元素

lambad表达式:

  • 元素只有一行,可以省略return  和大括号
  • 只有一个参数可以省略参数括号

Sorted(排序)
  • 回由此流的元素组成的流,根据自然顺序排序(默认排序)。

Distinct(去重)

 distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。

注意点:如何是自定义的类,一定要去重写它的equals和hashcode这二个方法

Limit(限制)

limit()方法可以将流限制为指定的元素数。

Skip(跳过)

skip()方法可跳过前N个元素。

Peek(展示)

 peek()方法可以用于在Stream流中获取元素同时执行一些操作,如打印、调试、观察等。通常会与其他的方法联合使用。

终止操作

终止操作返回一个结果或副作用(例如:显示控制台输出),并将流关闭

forEach(循环)

forEach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值

类似于遍历集合,但需要注意的是如果你对元素进行了修改,也会影响到原来的集合数据

Collect(收集)

collect()方法可以将流中的元素收集到一个集合中。一般与其他方法配合使用。

主要用于将流转化成我们常用的集合类型

转化成List

 转化成Map

 Count(计数)

 count()方法可以返回流中的元素数。

 Reduce(聚合)

reduce()方法可以将流元素聚合为单个结果。它接受一个BinaryOperator参数作为累加器

.......

还有一些不常用的就不在这里做说明了,自己去看jdk文档 

使用Stream流的优缺点:

优点:

Stream流可以帮助简化代码,减少样板代码,从而提高代码质量和可读性。

Stream流充分利用了现代多核处理器的优势,在多线程场景下可以获得更好的性能表现。

Stream流提供了丰富的操作方法,可以轻松地处理各种集合和数组的数据,从而降低程序员的编码难度和心理负担。

Stream流可以帮助开发人员更容易地写出函数式风格的代码,使代码更加健壮可维护。

缺点: 

Stream流有时候会让代码变得复杂,反而降低了可读性,因此在某些简单的情况下可能不需要使用Stream流。
Stream流可能会对程序的性能产生一定影响,尤其是在大型数据集或者复杂的业务逻辑的情况下,程序员需要根据具体的情况进行测试和分析,选择最优解。
Stream流可能会造成资源浪费,例如创建中间操作的临时对象,这些对象将占用存储空间,导致效率降低。
在实际开发中,应该根据具体情况来决定是否使用Stream流。一般建议在数据集较大或者需要进行复杂的数据处理操作时使用Stream流,而在一些简单的操作中则可以直接使用循环和传统的集合操作方法。此外,如果代码可读性受到影响,也可以考虑使用传统的集合操作方法来实现代码。

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smilehjl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值