Stream流的使用
Stream使用
Stream和集合的差异在于:
- 集合包含当前数据结构中的所有值,是已经计算好的,Stream是按需计算
- 外部迭代和内部迭代:集合的数据是已经计算好的,迭代需要人工在外部代码进行管理,Stream是只需要告诉它你需要什么,它在内部帮你实现好,返回
- 一次性的流:和迭代器类似,只能迭代一次,使用过的流不可以再使用
常用方法
stream()/parallelStream()
//示例
list.stream();//return Stream<E>
/* filter(T->boolean)*/
//保留年龄为 20 的 person 元素
list = list.stream()
.filter(person -> person.getAge() == 20)
.collect(Collectors.toList());
distinct()
去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的
sorted() / sorted((T, T) -> int)
//如果流中的元素的类实现了Comparable的接口,即有自己的排序规则,可直接调用sorted()方法
list = list.stream()
.sorted((p1, p2) -> p1.getAge() - p2.getAge())
.collect(Collectors.toList());
//可简化为
list = list.stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
limit(long n)
//返回前n个元素
list = list.stream()
.limit(2)
.collect(Collectors.toList());
skip(long n)
//去除前n个元素
list = list.stream()
.skip(2)
.collect(Collectors.toList());
map(T -> R)
//将流中的每一个元素 T 映射为 R(类似类型转换)
List<String> newlist = list.stream().map(Person::getName).collect(Collectors.toList());
flatMap(T -> Stream)
//将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(toList());
anyMatch(T -> boolean)
//流中是否有一个元素匹配给定的 T -> boolean 条件
//是否存在一个 person 对象的 age 等于 20:
boolean b = list.stream().anyMatch(person -> person.getAge() == 20);
allMatch(T -> boolean)
//流中是否所有元素都匹配给定的 T -> boolean 条件
boolean result = list.stream().allMatch(Person::isStudent);
noneMatch(T -> boolean)
//流中是否没有元素匹配给定的 T -> boolean 条件
boolean result = list.stream().noneMatch(Person::isStudent);
findAny() 和 findFirst()
//findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream()并行时找到的是其中一个元素)
//findFirst():找到第一个元素
count()
//返回流中元素个数,结果为 long 类型。
collect()
//收集方法,常用的是 collect(toList()),还有 collect(toSet()) 等,参数是一个收集器接口。
forEach()
//打印各个元素:
list.stream().forEach(System.out::println);
//向数据库插入新元素:
list.stream().forEach(PersonMapper::insertPerson);
//数值流转换为流
Stream<Integer> stream = intStream.boxed();
//groupingBy 用于将数据分组,最终返回一个 Map 类型
Map<Integer, List<Person>> map = list.stream().collect(groupingBy(Person::getAge));
//多级分组
Map<Integer, Map<T, List<Person>>> map = list.stream().collect(groupingBy(Person::getAge, groupBy(...)));
//partitioningBy 分区
//分区与分组的区别在于,分区是按照 true 和 false 来分的
Map<Boolean, List<Person>> map = list.stream()
.collect(partitioningBy(p -> p.getAge() <= 20));