* 流的创建(通过已有集合studentList.stream()、Stream.of())
* 中间操作(filter(筛选,过滤)、map(映射)、sorted(排序)、limit(返回前n个)、skip(去掉前n个)、distinct(去重))得到的结果还是一个stream
* 最终操作(count(统计流中个数)、forEach(迭代遍历)、collect(规约转换成集合))
1.实现手动分页可用
//两表或者多表数据组装无法使用分页插件时,可以使用stream进行快速分页
List<JDTrackConsistentPCDTO> jdTrackConsistentPCDTOSNew = jdTrackConsistentPCDTOS.stream() //首先将从数据库中查到的数据转为流
.skip((pageNum-1) * pageSize ) //使用skip()函数,这个函数的意思为跳过。需保证每次从数据库中查询的数据顺序一致。
.limit(queryParams.getPageSize()) // limit代表从第1位获取至 page.getPageSize位
.collect(Collectors.toList());// 转为一个集合
2.list根据某个字段为key转map
// 转为map之后,后续可以根据map进行操作,可以实现一些比较难处理的排序等等
Map<String, Student> dpTrackMap = jdTrackConsistentPCDTOList.parallelStream().filter(item -> item != null && StringUtils.isNotBlank(item.getName())).collect(Collectors.toMap(Student::getName, v -> v, (k1, k2) -> k1));
3.根据某个字段去重
/**
* 去重工具类
* @author 代码丰
*/ @Slf4j
public class CustomizeDistinctUtil {
//基本思路
//1.利用 ConcurrentHashMap 的 putIfAbsent(假如map中key对应的value不存在,放value进入map 假如map中key对应的value存在,返回key对应的value)
//2. 构造 Predicate 返回值
// 不存在时,putIfAbsent 得到null,== null比较后 会返回true
//3. filter true的得到保留 false的直接过滤
//4. 效果为只有不存在的才会保留,存在的都得到了过滤,即实现去重
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
}
/**
可以根据自己需要的字段进行equals判断
*/
List<Student> after= list.stream().filter(CustomizeDistinctUtil.distinctByKey(Student::getId)).collect(Collectors.toList());
4.根据某个字段排序
List<Person> collect=list.stream().sorted(Comparator.comparing(Person::getSalary)).collect(Collectors.toList())
5.根据某个字段过滤
//filter条件可以判断大于等于数值类型或者是字符串是否相等,来进行筛选过滤
List<Student> filterList = studentList.stream().filter(student -> student.getName() == "迪迦").collect(Collectors.toList());
6.查询列表第一个数据findFirst(),findAny(), findAny()在并行流parallelStream中可能返回的数据不是第一个,但是串行的情况下一般都会返回第一个,findAny() 是为了提高效率,数据准确性没有很好的保证
// 查找符合要求的第一条数据, 如果不存在返回null
Student studentInfo = studentList.stream().filter(student -> "迪迦".equals(student.getName())).findAny().orElse(null);
7.获取集合中某个属性的集合
//获取某个属性的list集合
listDto.stream().filter(item -> item != null && StringUtils.isNotBlank(item.getCargoNo())).map(WeightAndVolumeExcelDTO::getCargoNo).collect(Collectors.toList())
//可加上distinct,或者直接toset的方式进行去重
listDto.stream().filter(item -> item != null && StringUtils.isNotBlank(item.getCargoNo())).map(WeightAndVolumeExcelDTO::getCargoNo).distinct().collect(Collectors.toList()) --Collectors.toSet()