【Stream数据操作】

本文详细介绍了使用Java8StreamAPI进行数据去重、转换字符串、列表合并、排序、日期范围过滤以及复杂数据处理的方法,包括使用`toMap`、`TreeSet`、流扁平化等技术.
摘要由CSDN通过智能技术生成

Stream数据操作:

1.数据去重 跟进集合中单个和多个元素去重


	//toMap
   List<Test> distinctList = new ArrayList<Test>(list.stream()
                    .collect(Collectors.toMap(Test::getId,
                            Function.identity(),
                            (existing, replacement) -> existing))
                    .values());

List<Test> distinctList = new ArrayList<>(list.stream()
                                    .collect(Collectors.toMap(
                                        test -> Arrays.asList(test.getId1(), test.getId2(), test.getId3()), // 复合键
                                        Function.identity(),
                                        (existing, replacement) -> existing))
                                    .values());



	//TreeSet
	List<Test> distinctList = list.stream()
                             .collect(Collectors.collectingAndThen(
                                 Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Test::getId))),
                                 ArrayList::new));


List<Test> distinctList = list.stream()
                              .collect(Collectors.collectingAndThen(
                                  Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(test ->
                                      Arrays.asList(test.getId1(), test.getId2(), test.getId3())))),
                                  ArrayList::new));





  1. 获取集合元素String:“1,2,3”;转为List;字符串处理
  List<Integer> roleIdList = list.stream()
                .map(UserRoleVo::getRoleId)
                .flatMap(roleIds -> Arrays.stream(roleIds.split(",")))
                .map(Integer::parseInt)
                .distinct()
                .collect(Collectors.toList());

	//字符串转集合
  List<Integer> userIdList = Arrays.stream(haveImageUserIds1.split(","))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
   //获取集合中元素String:"1,2,3";转为List<Integer> 并按源集合id分组(Java9以上)
 Map<Integer, List<Integer>> collect = permissionIds.stream()
                .collect(Collectors.groupingBy(
                        TUserRoles::getId,
                        Collectors.flatMapping(
                                item -> Arrays.stream(item.getPermissionId().split(","))
                                        .map(Integer::parseInt),
                                Collectors.toList()
                        )
                ));
``


3.Java 8的流操作来实现将包含逗号分隔整数字符串的List转换为List。

        List<String> stringList = new ArrayList<>();
        stringList.add("1,2,3");
        stringList.add("5,6");
        stringList.add("88");
        
        List<Integer> integerList = stringList.stream()
                .flatMap(str -> Arrays.stream(str.split(",")) // 将逗号分隔的字符串拆分为流
                        .map(Integer::parseInt) // 将字符串转换为整数
                )
                .collect(Collectors.toList());

4.List list 集合中有batchNumber和breedId还有price字段,我需要把batchNumber和breedId相同的数据合成一条数据,合成的这一条数据所有的price相加set这条数据的price上

```Map<String, Double> mergedData = list.stream()
    .collect(Collectors.toMap(
        catVo -> catVo.getBatchNumber() + catVo.getBreedId(),
        PurchaseCalendarCatVo::getPrice,
        Double::sum
    ));

List<PurchaseCalendarCatVo> mergedList = mergedData.entrySet().stream()
    .map(entry -> {
        String[] keys = entry.getKey().split(" ");
        PurchaseCalendarCatVo mergedCatVo = new PurchaseCalendarCatVo();
        mergedCatVo.setBatchNumber(keys[0]);
        mergedCatVo.setBreedId(keys[1]);
        mergedCatVo.setPrice(entry.getValue());
        return mergedCatVo;
    })
    .collect(Collectors.toList());

5.集合根据对应属性排序

    /**
     * 集合根据对应属性排序
     * @param list list
     * @param propertyExtractor 属性
     * @param reverse 是否倒序
     * @return 排序后的集合
     * @param <T> 接受类型为 T 的对象
     * @param <U> 返回一个 U 类型的可比较属性
     */
    public static <T, U extends Comparable<? super U>> List<T> sortByProperty(List<T> list, Function<? super T, ? extends U> propertyExtractor, boolean reverse) {
        return list.parallelStream()
                .sorted(reverse ? Comparator.comparing(propertyExtractor, Comparator.reverseOrder()) : Comparator.comparing(propertyExtractor))
                .collect(Collectors.toList());
    }

6.根据日期范围过滤集合

 /**
     * 根据日期范围过滤集合1
     * @param <T> 集合元素的类型
     * @param list 要过滤的集合
     * @param startDate 范围开始日期
     * @param endDate 范围结束日期
     * @param dateExtractor 提取日期的函数
     * @return 过滤后的集合
     */
    public static <T> List<T> filterByDateRange(List<T> list, LocalDate startDate, LocalDate endDate, Function<? super T, LocalDate> dateExtractor) {
        return list.stream()
                .filter(obj -> isInRange(obj, startDate, endDate, dateExtractor))
                .collect(Collectors.toList());
    }

    /**
     * 检查对象是否在指定日期范围内2
     * @param <T> 对象的类型
     * @param obj 要检查的对象
     * @param startDate 范围开始日期
     * @param endDate 范围结束日期
     * @param dateExtractor 提取日期的函数
     * @return 对象是否在日期范围内
     */
    private static <T> boolean isInRange(T obj, LocalDate startDate, LocalDate endDate, Function<? super T, LocalDate> dateExtractor) {
        LocalDate purchaseTime = dateExtractor.apply(obj);
        return purchaseTime.equals(startDate) || purchaseTime.equals(endDate) ||
                (purchaseTime.isAfter(startDate) && purchaseTime.isBefore(endDate));
    }

7.获取集合中的字段为Json,并获取对应Json中的对象属性;得到对应属性集合

   List<Integer> list = problems.stream()
                        .filter(l -> StringUtils.isNotBlank(l.getProblem())) // 过滤空问题
                        .flatMap(l -> JSON.parseArray(l.getProblem(), ProblemDTO.class).stream()) // 将字符串解析为 ProblemDTO 列表,并扁平化为单个流
                        .map(ProblemDTO::getId) // 提取 ProblemDTO 对象中的 id
                        .collect(Collectors.toList());

8.复杂数据处理,List集合先根据其中元素分组,对分组后的map的value进行过滤处理。

     List<Test> collect = list.stream()
                    .collect(Collectors.groupingBy(Test::getpId))//按pid分组得到 Map<Integer,List<Test>> map;
                    .values().stream()
                    .flatMap(group -> group.stream()
                     //对map的value根据条件过滤,保留value中List集合的元素tyep==1或(type==3并且集合中有任意一条元素的status>8)。
                            .filter(item -> item.getType() == 1||
                                    (item.getType() == 3 && group.stream().anyMatch(innerItem -> innerItem.getStatus() > 8))))
                    .collect(Collectors.toList());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值