一、Java8中的stream流
(一)、概念
Java 8中的Stream是一种处理集合数据的方式,它可以被用来过滤、排序、映射等操作。Stream可以让我们以一种声明性的方式来处理数据集合,而不是以传统的命令式方式。与集合不同的是,Stream并不直接操作数据集合,而是生成一个新的Stream,或者在数据集合上执行一些操作返回一个新的Stream。
(二)、Stream的优点
- 声明性:使用Stream可以更加清晰和简洁地表达我们对集合数据的操作。
- 可重用:Stream可以被重复使用,也可以被组合成复杂的操作序列。
- 并行处理:Stream可以支持并行处理,大大提高处理效率。
(三)、Stream的操作可以分为两类
- 中间操作(Intermediate Operations):对数据集合进行操作并返回一个新的Stream,例如过滤和映射。
- 终止操作(Terminal Operations):对数据集合进行操作并返回一个结果,例如计算总和和计算平均数。
二、Stream流的常用方法
(一)、Filter过滤
filter方法需要一个Predicate类型的参数,Predicate是一个函数接口,用于判断一个对象是否满足某个条件。filter方法会将集合中的每一个元素都传入Predicate中,如果Predicate返回true,则保留该元素,否则移除该元素。
(二)、Sorted排序
Stream流中的sorted()方法可以对元素进行排序操作。该方法有两种重载形式:sorted()和sorted(Comparator<T> comparator)。其中,前者将默认按照自然顺序排序,后者可以按照指定的比较器进行排序。
需要注意的是,sorted()方法并不会改变原来的元素顺序,它会返回一个新的有序的流。如果需要将排序结果保存下来,可以使用collect()方法将元素收集到一个List中。
(三)、Map映射
Stream流中的Map方法可以将一个Stream中的每个元素都映射成另外一个元素,映射后的结果会放到一个新的Stream中返回。
map( Function<? super T, ? extends R> mapper):将原Stream中的元素按照Function映射转换成另一个元素。
(四)、Match匹配
match()
方法有三个方法重载,分别为:
allMatch(Predicate<? super T> predicate)
anyMatch(Predicate<? super T> predicate)
noneMatch(Predicate<? super T> predicate)
这三个方法都接收一个 Predicate
参数,它表示一个函数接口,用于对流中的元素进行匹配。这个函数接口中有一个唯一的抽象方法 test(T t)
,用于判断流中的元素是否符合匹配条件。
-
allMatch(Predicate<? super T> predicate)
方法判断流中的所有元素是否都符合给定的匹配条件。如果流为空,则返回true
。 -
anyMatch(Predicate<? super T> predicate)
方法判断流中是否存在任意一个元素符合给定的匹配条件。如果流为空,则返回false
。 -
noneMatch(Predicate<? super T> predicate)
方法判断流中是否所有元素都不符合给定的匹配条件。如果流为空,则返回true
。
(五)、Count计数
Stream流的Count方法用于计算Stream流中的元素个数。它返回一个long类型的值,代表Stream流中元素的个数。
(六)、Collect收集
在流中,有一组与Collectors类相关的方法,可以用来收集流中的元素并将它们转换为不同的数据结构。下面列出了一些常用的Collectors方法:
toList():将流中的元素转换为列表。
List<String> names = people.stream()
.map(Person::getName)
.collect(Collectors.toList());
toSet():将流中的元素转换为集合。
Set<String> uniqueNames = people.stream()
.map(Person::getName)
.collect(Collectors.toSet());
toMap():将流中的元素转换为Map。
Map<String, Integer> nameToAgeMap = people.stream()
.collect(Collectors.toMap(Person::getName, Person::getAge));
这些方法都返回一个收集器对象,可以通过调用它们的静态方法来使用。Collectors类中还有许多其他的方法,可以根据需要选择使用。