Java8新特性Stream流的常用操作

 * 流的创建(通过已有集合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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值