引言:
Stream 是Java8 中新增的处理集合的概念,可以执行查找、过滤和映射数据等操作。Stream API 提供了一种高效且易于使用的处理集合数据的方式,方便对集合数据进行各种处理。
Stream 的特点:
Stream,简称“流”,不会存储元素,不会改变源对象,返回一个Stream的结果,Stream 操作是lazy的,会等到需要结果的时候才执行。
Stream API 的说明:
Stream的生命周期如下所示:
生命周期
分为Stream对象创建,Stream数据中间操作,Stream结果操作三类。
一,Stream 创建的方式
使用集合类的stream方法创建Stream对象:
List list = new ArrayList();
Stream stream = list.stream();
使用Stream类的静态方法of()创建Stream对象:
Stream stream = Stream.of("111","222","3333");
使用数组创建Stream对象:
String[] strs = new String[10];
Stream stream = Arrays.stream(strs);
使用Stream类的迭代方法iterate创建Stream对象:
方法格式:
iterate(T seed, UnaryOperator f)
seed是种子,整个iterate的返回结果的元素是无限的,其序列如下所示:
seed,f(seed),f(f(seed))...以此类推。
举个栗子:
Stream stream = Stream.iterate(1, (x) -> x * 2);
得到的stream内容为:1,2,4,8,16.....。
使用Stream类的生成generator创建Stream对象:
方法格式:
generate(Supplier s)
Supplier是一个函数接口,只封装了一个get()方法,就是说可以获取任意值。一般用于随机数。
举个栗子:
Stream stream = Stream.generate(()-> java.lang.Math.random());
得到是stream为无限的随机数。
二,Stream数据中间操作
filter:筛选函数:
接收lambda,返回值需要为boolean的类型。
举个栗子:
Stream.of(1, 2, 3, 4, 5).filter(item -> item > 2).forEach(System.out::println);
打印结果:3,4,5
limit:截断函数:
使元素个数不超过规定的数量。
举个栗子:
Stream.of(1, 2, 3, 4, 5). limit(2).forEach(System.out::println);
打印结果:1,2
skip:跳过函数:
返回一个去掉前n个元素的流,若不足n个元素,则返回空流,超过n个,返回n之后的所有元素的流。
举个栗子:
Stream.of(1, 2, 3, 4, 5). skip(3).forEach(System.out::println);
打印结果:4,5
distinct:去重函数:
通过元素的hashCode()和equals()去除重复元素,对象必须重写过hashCode方法和equals方法。
举个栗子:
Stream.of(1, 2, 2, 4, 5). distinct.forEach(System.out::println);
打印结果:1,2,4,5
map:转换函数:
Stream中包含的元素使用给定的转换函数进行转换,保留转换后的结果组成的流。
举个栗子:
Stream.of("a", "b", "c").map((str)-> str.toUpperCase())
.forEach(System.out::println);
打印结果:A,B,C
sorted:排序函数:
sorted() :按照Comparable(内比较器,compareTo实现比较)来排序
sorted(Comparator com) :按照Comparatot(外比较器,compare实现比较)来排序。
举个栗子:
List list = Arrays.asList(2,3,1,4);
list.stream().sorted().forEach(System.out::print);
打印结果:1,2,3,4
List list = Arrays.asList(2,3,1,4);
list.stream().sorted((a, b) -> {
return (-1) * a.compareTo(b);
}).forEach(System.out::println);
打印结果:4,3,2,1
三,Stream结果操作
allMatch :是否所有元素都匹配anyMatch:是否至少匹配到一个元素
以上返回boolean类型,true或false。
举个栗子
boolean allMatch = Stream.of(1, 2, 3, 4,5)
.allMatch((integer) -> integer
System.out.println(allMatch);
// 打印结果:false
boolean anyMatch = Stream.of(1, 2, 3, 4,5)
.allMatch((integer) -> integer
System.out.println(anyMatch);
// 打印结果:true
findFirst:返回第一个元素findAny:返回当前流中任意元素
以上两个方法返回流中的元素的Optional实例。
Optional first = Stream.of(1,2,3,4,5).findFirst();
Optional any = Stream.of(1,2,3,4,5). findAny();
reduce(T identity,BinaryOperator):根据模型,从元素中计算得到一个值
实际使用中,可以用Lambada表达式或使用自定义的BinaryOperator实现方法扩展该功能,计算是迭代计算的。
//在Integer的源码中:
public static int sum(int a, int b) {
return a + b;
}
collect:将流转换一个Collector接口的实现,该实现可以自己定制。
List list = Arrays.asList(1,2,3,4,5);
List stringList =list.stream().collect(Collectors.toList());
stringList.forEach(System.out::println);
打印结果:1,2,3,4,5
以上是今天Stream API 的学习主要内容,
其中collect和reduce功能非常强大,可自己定制想要的效果,篇幅关系不在详细描述。
领取专属 10元无门槛券
私享最新 技术干货