API Specification
Stream中新增方法
default Stream<T> dropWhile(Predicate<? super T> predicate)
default Stream<T> takeWhile(Predicate<? super T> predicate)
public static<T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
public static<T> Stream<T> ofNullable(T t)
dropWhile
从流起始处丢弃匹配Predicate的元素至第一个不匹配的。
如果都匹配则返回空流,如果第一个就不匹配那么就是返回原始流。
形式接近Stream<T> skip(long n)
,从头跳过指定数量的元素。
Stream.of(1, 3, 2, 9, 4, 5, 6).dropWhile(x -> x < 5).forEach(System.out::println);
takeWhile
从流的起始处返回匹配的元素,从第一个不匹配的元素处开始丢弃之后元素。
如果都匹配则返回原始流,如果第一个就不匹配那么就是返回空流。
形式接近Stream<T> limit(long maxSize)
,截断长度不超过maxSize的部分,丢弃之后的元素。
Stream.of(1, 3, 2, 9, 4, 5, 6).takeWhile(x -> x < 5).forEach(System.out::println);
iterate
新的流创建方式,与之前创建无限流相比多提供了终止条件,使用形式类似于for循环。
Stream.iterate(1, n -> n <= 10, n -> n + 1).forEach(System.out::println);
ofNullable
如果元素非null 则返回仅含一个元素的流,如果元素为null 则返回一个空的流。
Stream.of("a", null, "c").flatMap(Stream::ofNullable).forEach(System.out::println);
Collectors中新增收集器
public static <T, A, R> Collector<T, ?, R> filtering(Predicate<? super T> predicate, Collector<? super T, A, R> downstream)
public static <T, U, A, R> Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<? super U, A, R> downstream)
新增的两个收集器都比较适用于多级缩减的场景,比如处理分组、分区(groupingBy、partitioningBy)时用作downstream。
filtering
直接放官方API规范中的例子。
Map<Department, Set<Employee>> wellPaidEmployeesByDepartment
= employees.stream().collect(
groupingBy(Employee::getDepartment,
filtering(e -> e.getSalary() > 2000,
toSet())));
filtering收集器与Stream的filter()区别在于,如果某些部门中没有员工符合条件(e -> e.getSalary() > 2000),对于filtering收集器仍可以获得部门到空集的映射,而使用filter()则根本就不存在该部门的映射了。
flatMapping收集器用于在收集元素之前进行扁平映射,再将其通过downstream来收集。