简介
Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。
同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是惰性取值,只有等到用户真正需要结果的时候才会执行。
Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。
过滤
//list list2 为数据源
//取list中name不包含list2的数据集合并过滤掉名字为‘专家的’的数据
List<Grade> collect = list.stream()
.filter(p -> list2.stream().noneMatch(p2 -> p2.getName().equals(p.getName()))).filter(item->!item.getName().equals("专家"))
.collect(Collectors.toList());
分组
分组取最某字段最大值的数据集合
//根据no分组取score最大值的数据集合
//去重取最大值的数据集合
List<Grade> collect1 = collect.stream()
.collect(Collectors.groupingBy(
Grade::getNo,
Collectors.maxBy(Comparator.comparingDouble(Grade::getScore))))
.values()
.stream()
.map(Optional::get)
.collect(Collectors.toList());
map
List<User> users = // 用户列表初始化
List<UserDTO> userDTOs = users.stream()
.map(user -> new UserDTO(user.getName(), user.getAge()))
.collect(Collectors.toList());
// userDTOs 包含了转换后的UserDTO对象列表