一、Stream语法
1、分组groupingBy
SysDictData dictData = new SysDictData();
dictData.setStatus("0");
Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
2、任意匹配anyMatch
- anyMatch(任意匹配)是一个常用的函数,用于检查集合中是否存在至少一个满足指定条件的元素。它接受一个谓词作为参数,并返回一个布尔值,表示集合中是否存在满足该谓词的元素。
- 例如,在Java中,可以使用Stream的anyMatch函数来检查一个整数集合中是否存在大于10的元素。代码示例如下:
List<Integer> numbers = Arrays.asList(5, 8, 12, 3, 9); boolean hasNumberGreaterThanTen = numbers.stream().anyMatch(num -> num > 10); if (hasNumberGreaterThanTen) { System.out.println("集合中存在大于10的元素"); } else { System.out.println("集合中不存在大于10的元素"); }
上述代码中,anyMatch函数使用lambda表达式 num -> num > 10 作为谓词,检查集合中是否存在大于10的元素。如果存在,则输出 “集合中存在大于10的元素”,否则输出 “集合中不存在大于10的元素”。
二、实际问题汇总
1. 分组
1.1 对Map的key进行分组同时对value进行排序
为什么需要对key进行分组,因为使用的是IdentityHashMap
Map<String, LocalDate> map1 = new IdentityHashMap<>();
// 对key分组
Map<String, List<LocalDate>> groupedMap1 = map1.entrySet().stream()
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
// 排序
groupedMap1.forEach((key, value) -> value.sort(Comparator.naturalOrder()));
//打印
groupedMap1.forEach((key, value) -> System.out.println(key + ": " + value));
1.2 分组时指定key和value
// 指定自定义的值类型
Map<Integer, Set<String>> ageToUniqueNames = people.stream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.mapping(Person::getName, Collectors.toSet())
));
2. 排序
2.1 在List中根据对象的LocalDate属性进行排序
List<对象> planList = List集合对象.stream()
.sorted((Comparator.comparing(RepaymentPlan::getExpectRepayDate)))
.collect(Collectors.toList());
3. 其余场景
3.1 将list中对象的某属性重复的这个值提取出来,并返回一个list
// 使用groupingBy按planId分组,并计算每个组的数量
Map<Long, Long> planIdCountMap = repaymentRecords.stream()
.collect(Collectors.groupingBy(RepaymentRecord::getPlanId, Collectors.counting()));
// 过滤出数量大于1的组,即重复的planId
List<Long> duplicatePlanIds = planIdCountMap.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());