Java8 stream

  • 排序(倒序,正序去掉reversed(),根据Reporting实体的isDeadLine字段倒序)
   List<Reporting> collect1 = integerListEntry.getValue().stream().sorted(Comparator.comparing(Reporting::getIsDeadLine).reversed()).collect(Collectors.toList());
  • List  转  map 相同key,value 合为一个List(根据ParkingImg实体的PARKING_ID字段排序,如果有多个key是PARKING_ID,结果放入一个集合中)
  Map<String, List<ParkingImg>> collect = parkingImgs.stream().collect(Collectors.toMap(ParkingImg::getPARKING_ID,
                e -> new ArrayList<>(Arrays.asList(e)),
                (List<ParkingImg> oldList, List<ParkingImg> newList) -> {
                    oldList.addAll(newList);
                    return oldList;
                }));

或者
Map<String, List<ParkingImg>> collect = parkingImgs.stream().collect(Collectors.groupingBy(ParkingImg::getPARKING_ID));		
  • 分组(先过滤Discovery实体的unitName字段不为空,然后根据Discovery的unitName字段分组)
   Map<String, List<Discovery>> collect = records.stream().filter(item -> !item.getUnitName().isEmpty()).collect(Collectors.groupingBy(Discovery::getUnitName))
  • 过滤(Discovery实体的feedbackDate字段为空或者findDate字段小于parse(一个时间))
   List<Discovery> collect = discoveryService.list(type, range).stream().filter(item -> item.getFeedbackDate() == null || item.getFindDate().after(parse)).collect(Collectors.toList());      
  • 对集合的每一项都调用一次同一个方法(循环遍历roads集合将Road实体转换为ORoad实体返回ORoad实体集合)。map 方法用于映射每个元素到对应的结果
public static ORoad fill(Road road) {
        ORoad oRoad = new ORoad();
        oRoad.setId(road.getId());
        oRoad.setTargetType("road");
        return oRoad;
    }
    public static List<ORoad> fill(List<Road> roads) {
        return roads.stream().map(ORoad::fill).collect(Collectors.toList());
    }
或者
    public static List<ORoad> fill(List<Road> roads) {
        return roads.stream().map(item -> fill(item)).collect(Collectors.toList());
    }

根据集合的某一个字段去重


    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;
    }
调用方法:
        List<String> list = new ArrayList<>();
        List<CheckIn> checkIns = checkInMapper.checkInTodayList(DateUtil.getNowYYMMdd(), stationName);
        checkIns.stream()
                .filter(distinctByKey(o -> o.getStaffId()))
                .forEach(item -> list.add(item.getName()));

list 转 map

key和value都是实体的字段    
Map<Integer, String>  productTreatmentMap = productTreatments.stream().collect(Collectors.toMap(ProductTreatment::getProductId, ProductTreatment::getTreatmentList));

key是实体字段,value是实体   
Map<Integer, String>  productTreatmentMap = productTreatments.stream().collect(Collectors.toMap(ProductTreatment::getProductId, ProductTreatment->ProductTreatment));

两层分组

  Map<Long, Map<Integer, List<ProductBatchStationEntity>>> batchStationGroup = productBatchStationEntities
                .stream()
                .collect(Collectors.groupingBy(ProductBatchStationEntity::getProductId,
                        Collectors.groupingBy(ProductBatchStationEntity::getType,
                                Collectors.toList())));

查List对象某属性是否有重复

//判断姓名是否有重复,练习使用java8的stream方法
        //方法1. distinct, 直接比较大小,只知道是否有重复
        List<String> collect1 = list.stream().map(User::getName).distinct().collect(Collectors.toList());
        System.out.println(collect1.size()!=list.size()?"方法1-姓名有重复":"无重复");
        //方法2.用户姓名计数
        Map<Object, Long> collect2 = list.stream().collect(
                Collectors.groupingBy( User::getName , Collectors.counting()  )   );
        System.out.println("姓名重复计数情况:"+collect2);
        //筛出有重复的姓名
        List<Object> collect3 = collect2.keySet().stream().
                filter(key -> collect2.get(key) > 1).collect(Collectors.toList());
        //可以知道有哪些姓名有重复
        System.out.println("方法2-重复的姓名 : "+collect3);
        //方法3,对重复的姓名保留计数
        List<Map<String, Long>> collect4 = collect2.keySet().stream().
                filter(key -> collect2.get(key) > 1).map(key -> {
            Map<String, Long> map = new HashMap<>();
            map.put((String) key, collect2.get(key));
            return map;
        }).collect(Collectors.toList());
        System.out.println("方法3-重复的姓名及计数:"+collect4);

分组再排序

list.stream()
              .collect(Collectors.groupingBy(MsgdaLevelChannelRelationshipDO::getLevelId,
                        Collectors.collectingAndThen(Collectors.toList(),
                                list -> list.stream().sorted(Comparator.comparing(MsgdaLevelChannelRelationshipDO::getSortNum))
                                        .collect(Collectors.toList()))));

分组再合并

    Map<String, List<String>> ruleIdHitKeyListMap = detailDtoList.stream()
                .collect(Collectors.groupingBy(ContentRateDto.ContentRateDetailDto::getRuleId,
                        Collectors.collectingAndThen(
                                Collectors.mapping(ContentRateDto.ContentRateDetailDto::getHitKeyList, Collectors.toList()),
                                list -> list.stream().flatMap(Collection::stream).collect(Collectors.toList()))));

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值