这是我参与更文挑战的第18天,活动详情查看: 更文挑战
上期我们已经介绍了Predicate的简单用法和Stream的简单介绍,这期我们一起来学习Stream的更深入的了解和Stream常用的一些中间方法和末端方法。
什么是Stream?
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream(流)是一个来自数据源的元素队列并支持聚合操作。Stream并不会存放数据,而是按需计算。数据源 流的来源,可以是集合,数组,I/O channel, 产生器generator 等。
Stream常用中间方法
中间方法返回的是一个新的流
- filter(Predicate predicate):过滤Stream中所有不符合predicate的元素。
- mapToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFUnction转换生成的所有元素。
- peek(Consumer action):依次对每个元素执行一些操作,该方法返的流与原有流包含的元素相同。
- distinct():该方法用于去除流中重复的元素(对于对象不行,因为new出来的对象的地址不同)
- sorted():保证流中的元素在后续的访问中处于有序的状态。
- limit(long maxSize):该方法保证对流的后续访问中最大允许的元素个数。
在 Java 8 中, 集合接口有两个方法来生成流:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
public class Test {
public static void main(String[] args) {
//创建一个数组作为集合,不能使用增加,删除,只能用来遍历
List<String> stringList = Arrays.asList("ab","cd","gh","ad","ab","gh");
//调用Stream的filter方法,把集合成流,然后再把流转为集合collect(Collectors.toList())
List<String> filtered = stringList.stream().filter(obj -> obj.contains("d")).collect(Collectors.toList());
//输出[cd, ad]
System.out.println(filtered);
//distinct去除重复元素
List<String> distincted = stringList.stream().distinct().collect(Collectors.toList());
System.out.println(distincted);
//limit获取流中前n个元素
List<String> limited = stringList.stream().limit(3).collect(Collectors.toList());
System.out.println(limited);
//skip获取流中除了前n个元素以外的元素
List<String> skipped = stringList.stream().skip(3).collect(Collectors.toList());
System.out.println(skipped);
//map对流中所有的元素做统一处理
List<String> mapped = stringList.stream().map(obj -> "Gw_"+obj).collect(Collectors.toList());
System.out.println(mapped);
//sorted 保证流中的元素在后续的访问中处于有序的状态。
List<String> sorted = stringList.stream().sorted().collect(Collectors.toList());
System.out.println(sorted);
}
}
Stream常用末端方法
- forEach(Consumer action):遍历流中所有的元素,对每个元素执行action
- toArray():将流中的元素转为一个数组
- reduce():通过某种操作来合并流中的元素
- min():返回流中最小的元素
- max():返回流中最大的元素
- count():返回流中元素的数量
- anyMatch(Predicate predicate):判断流中是否至少含有一个元素符合Predicate条件
- allMatch(Predicate predicate):判断流中是否每个元素符合Predicate条件
- noneMatch(Predicate predicate):判断流中是否每个元素都不符合Predicate条件
- findFirst():返回流中第一个元素
- findAny():返回流中任意一个元素(使用Stream时通常返回第一个,使用parallelStream()时,返回任意一个)
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
//创建一个数组作为集合,不能使用增加,删除,只能用来遍历
List<String> stringList = Arrays.asList("ab","cd","gh","ad","ab","gh");
//判断流中是否至少含有一个元素符合Predicate条件
System.out.println(stringList.stream().anyMatch(str -> str.equals("ad")));
//判断流中是否每个元素符合Predicate条件
System.out.println(stringList.stream().allMatch(str -> str.contains("d")));
//判断流中是否每个元素都不符合Predicate条件
System.out.println(stringList.stream().noneMatch(str -> str.contains("d")));
//返回流中第一个元素
System.out.println(stringList.stream().findFirst());
//返回流中任意一个元素,使用Stream时通常返回第一个,使用parallelStream()时,返回任意一个
System.out.println(stringList.stream().findAny());
//返回流中元素的数量
System.out.println(stringList.stream().count());
//遍历流中所有的元素,对每个元素执行action
stringList.stream().forEach(str -> System.out.println(str));
}
}