jdk8的Steam流工作常用方法总结

Steam流工作常用方法总结

收集list 以某几个字段为键以内容为list的map

Map<String, List<TVoucherDetail>> tVoucherDetailMap = list.stream().collect(Collectors.groupingBy(
                obj -> obj.getDocumentNumber() + "-" + obj.getCertificationData()
        ));

收集list 以某两个字段分组,并以进行统计

Map<String, Map<String, BigDecimal>> map = s1.collect(
                Collectors.groupingBy(
                        CurrentTransactionsCount::getCurrentUnitName,
                        Collectors.groupingBy(
                                CurrentTransactionsCount::getAssistCeanDept)
                        )
                ));

收集list 以某两个字段分组,并以进行统计数量

Map<String, Map<Integer, Long>> map = pfaDeptProblemPos.stream().collect(
                Collectors.groupingBy(
                        PfaDeptProblemPo::getThreeUnitName,
                        Collectors.groupingBy(PfaDeptProblemPo::getProblemType, Collectors.counting())));

收集list 以某两个字段分组,并以进行统计合计(需要判空处理)

Map<String, Map<String, BigDecimal>> map = s1.collect(
                Collectors.groupingBy(
                        CurrentTransactionsCount::getCurrentUnitName,
                        Collectors.groupingBy(
                                CurrentTransactionsCount::getAssistCeanDept,
                                Collectors.reducing(
                                        BigDecimal.ZERO,
                                        e -> e.getBalance() != null ? e.getBalance() : BigDecimal.ZERO,
                                        BigDecimal::add)
                        )
                ));

收集list中某个BigDecimal属性并统计

 BigDecimal sum = list.stream().filter(e -> e.getDebitAmount() != null).map(TVoucherDetail::getDebitAmount).reduce(BigDecimal.ZERO,BigDecimal::add);

收集list中某些属性映射到新的集合中

 // 使用map操作将Person对象映射到PersonDTO对象,并收集到新的List<PersonDTO>中  
        List<PersonDTO> personDTOs = people.stream()  
                .map(person -> new PersonDTO(person.getId(), person.getName())) // 创建新的PersonDTO对象  
                .collect(Collectors.toList()); // 收集到List中  

收集list集合以某个属性为键,以本身为值为map

Map<String, UserInfo> phoneNumberMap = list.stream()  
    .collect(Collectors.toMap(  
        UserInfo::getPhoneNumber(), // Key Mapper: 从每个UserInfo对象中提取电话号码作为Map的键  
        Function.identity(),         // Value Mapper: 使用UserInfo对象本身作为Map的值  
        (v1, v2) -> v1               // Merge Function: 如果存在键冲突(即两个UserInfo对象有相同的电话号码),则保留第一个对象(v1),丢弃第二个对象(v2)  
    ));

收集list集合中的对象,映射到另个一对象集合中

    List<Person> people = Arrays.asList(  
                new Person("1", "Alice", 30, "123 Street"),  
                new Person("2", "Bob", 25, "456 Avenue")  
        );
// 使用map操作将Person对象映射到PersonDTO对象,并收集到新的List<PersonDTO>中  
        List<PersonDTO> personDTO = people.stream()  
                .map(person -> new PersonDTO(person.getId(), person.getName())) // 创建新的PersonDTO对象  
                .collect(Collectors.toList()); // 收集到List中

根据list对象集合中某个属性去重

 List<Person> persons = Arrays.asList(
                new Person("Alice", 25),
                new Person("Bob", 30),
                new Person("Alice", 28), // 重复的name
                new Person("Charlie", 35)
        );

        Collection<Person> values = persons.stream().collect(Collectors.toMap(
                Person::getName,
                Function.identity(),
                (old, n) -> old
        )).values();

        values.forEach(System.out::println);
posted @ 2024-08-19 11:37  进击的乌拉  阅读(25)  评论(0编辑  收藏  举报