目录
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流,而在一些简单的操作中则可以直接使用循环和传统的集合操作方法。此外,如果代码可读性受到影响,也可以考虑使用传统的集合操作方法来实现代码。