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);