是Java8收集器中的一种,与SQL的GROUP BY子句类似的功能。
1.1,分组
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode));
}));
1.2,计数
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode,Collectors.counting()));
参考链接:java8 特性 - groupingBy
1.3,累和
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode,Collectors.summingInt(CbhsHsunitInfEntity::getPrice)));
1.4,排序并打印数据
Map<String, Long> map = fruitList.stream().map(Fruit::getName).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
map.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEachOrdered(System.out::println);
参考链接:Java8函数式编程(三):Collectors.groupingBy
2.1 将list转换为map,并设置key,value
部分源码:
public static <T, K, U> Collector<T, ?, Map<K,U>>
toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M>
toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
这是一个将List<Map<String,Object>>类型转换为map类型
String sqlks1 = "select distinct levelcode2,b.unitcode from sys_info a,sys_info_unitmap b where a.code=b.kscode ";
Map<String, String> unitKsMap = jdbcTemplate.queryForList(sqlks1).stream().collect(Collectors.toMap(new Function<Map<String, Object>, String>()
@Override
public String apply(Map<String, Object> stringObjectMap) {
return stringObjectMap.get("unitcode").toString();
}, new Function<Map<String, Object>, String>() {
@Override
public String apply(Map<String, Object> stringObjectMap) {
return stringObjectMap.get("levelcode2").toString();
}));
这是一个将List<实体类>类型转换为map类型
class Book {
private String name;
private int releaseYear;
private String isbn;
public Map<String, String> listToMap(List<Book> books) {
return books.stream().collect(Collectors.toMap(Book::getIsbn, Book::getName));
或者key值和value值都可以进行拼接
Map<String, BigDecimal> ksLabCostMap = cbhsXmftKsempcostEntityList.stream().collect(
Collectors.toMap(k -> k.getKscode()+"#"+k.getEmptitlecode(),part -> part.getUnittimecost())
2.2 冲突key处理
注意:当key值不唯一的时候,则需要引入一个合并函数,而这个合并函数使得保留了第一个key,后面如果有重复性的key值则不会被采纳
public Map<Integer, Book> listToMapWithDupKey(List<Book> books) {
return books.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(),
(existing, replacement) -> existing));
2.3 List 转 ConcurrentMap
1,什么是ConcurrentMap?
ConcurrentHashMap是一个线程安全,并且是一个高效的HashMap。
与HashMap不同的是,ConcurrentHashMap中多了一层数组结构,由Segment和HashEntry两个数组组成。其中Segment起到了加锁同步的作用,而HashEntry则起到了存储K.V键值对的作用。
在多线程中,每一个Segment对象守护了一个HashEntry数组,当对ConcurrentHashMap中的元素修改时,在获取到对应的Segment数组角标后,都会对此Segment对象加锁,之后再去操作后面的HashEntry元素,这样每一个Segment对象下,都形成了一个小小的HashMap,在保证数据安全性的同时,又提高了同步的效率。只要不是操作同一个Segment对象的话,就不会出现线程等待的问题!
相关链接:
Java集合–ConcurrentMap
ConcurrentHashMap 原理解析(JDK1.8
public Map<Integer, Book> listToConcurrentMap(List<Book> books) {
return books.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(),
(o1, o2) -> o1, ConcurrentHashMap::new));
2.4 Sorted Map
public TreeMap<String, Book> listToSortedMap(List<Book> books) {
return books.stream()
.sorted(Comparator.comparing(Book::getName))
.collect(Collectors.toMap(Book::getName, Function.identity(), (o1, o2) -> o1, TreeMap::new));
参考链接:Java 8特性 - Collectors toMap
遇到到,补充一点(后面有空再补充):
根据实体类CbhsXmftUnitmapEntity中的ItemCode,Unitcode两个字段对实体进行去重处理,字段的先后顺序对最终的结果有影响
List<CbhsXmftUnitmapEntity> cbhsXmftUnitmapEntities =new LinkedList<>();
cbhsXmftUnitmapEntities = cbhsXmftUnitmapEntities.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(o -> o.getItemCode()+ "#" + o.getUnitcode()))),
ArrayList::new));
问题描述:1,groupingBy()是Java8收集器中的一种,与SQL的GROUP BY子句类似的功能。1.1,分组// 根据unitcode进行分组,将unitcode相同的CbhsHsunitInfEntity实体放入list中,// 此时key是unitcode,value是listMap<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEn
Java8中Collectors.groupingBy()处理后的Map乱序问题
一、问题说明:
在数据库中取出数据后,按数据的某一属性进行分组,但得到的分组是乱序的,并不是按数据库中的顺序排列的。
二、解决过程
查看Collectors.groupingBy()的源码,发现该方法是默认 HashMap ,其次 value 值为 ArrayList 返回的,而 HashMap 是无序的。
//默认HashMap返回
public static <T, K, A, D> Collector<
最近接触到java8的collector功能,网上查了下资料学习,这里记录一下。
collect方法,它是一个能够把stream管道中的结果集装进一个List集合的终极操作。 collect是一个把stream规约成一个value的规约操作,这里的value可以是一个Collection、Map或者一个value对象。在下面这几种情况下,可以使用collect操作。
把stream...
Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组
数据准备:
public Product(Long id, Integer num, BigDecimal price, String name, String category) {
this.id = id;
this.num = num;
this.price = price;
this.name =...
来看个小例子: 把菜单中的菜按照类型进行分类,有菜的放一组,有肉的放一组,其他的都放另一组。
Map<Dish.Type, List<Dish>> collect = menu.stream().collect(groupingBy(Dish::getType));
用 Collectors.groupingBy 工厂方法返回的收集器就可以轻松地完成这项任务。
这里,给 groupingBy 方法传递了一个 Function (以方法引用的形式
文章目录前言一. 分组 groupingBy基础用法1. 按照某个属性分组2. 分组统计3. 分组求和4. 自定义分组条件------按姓名长度分组5. 自定义分组条件------按照多个字段分组高级用法1. 改变分组后的key和value2. 多级分组3. 我在项目中的使用例子
刚开始我只会使用普通的for、while循环,最多就增强for循环,后来在项目上看到其他同事在用,看起来很新颖、简洁的样子,然后我也开始尝试使用,用顺手之后发现是真的香。在使用的过程中,有些时候,不能完全实现自己所想的,也没
介绍 Java 8 groupingBy Collector
本文我们探讨下Java 8 groupingBy Collector,通过不同的示例进行详细讲解。
GroupingBy Collector
Java 8 Stream API 提供了声明方式处理流数据。static工厂方法Collectors.groupingBy() 和 Collectors.groupingByConcurrent...
Collectors.toMap和Collectors.groupingBy都是Java 8中的流操作工具类Collectors提供的用于收集元素的方法。
Collectors.toMap用于将流中的元素收集到一个Map中。它的使用方式是Collectors.toMap(keyMapper, valueMapper, mergeFunction)。其中keyMapper是一个Function,用于指定Map中的键是根据流中的元素如何映射得到的;valueMapper也是一个Function,用于指定Map中的值是根据流中的元素如何映射得到的;mergeFunction是一个BinaryOperator,用于在遇到键冲突时指定如何处理冲突。如果不提供mergeFunction,当遇到键冲突时会抛出IllegalStateException异常。
例如,我们可以使用Collectors.toMap将一个学生列表按照学生的id作为键,学生对象本身作为值收集到一个Map中。这样可以方便地根据学生id来查找对应的学生对象。
Collectors.groupingBy用于将流中的元素按照某个属性进行分组,并将分组结果收集到一个Map中。它的使用方式是Collectors.groupingBy(classifier)。其中classifier是一个Function,用于指定根据流中的元素的某个属性进行分组。分组的结果是一个Map,键是属性的值,值是符合该属性值的元素集合。
例如,我们可以使用Collectors.groupingBy将一个学生列表按照学生的id进行分组,将具有相同id的学生放在同一组中。这样可以方便地按照学生id来查找对应的学生集合。
FlowableWrongDbException: version mismatch: library version is ‘6.6.0.0‘, db version is 5.99.0.0
qq_32236925:
dbeaver 插入别名设置禁用
万物皆字节:
layui tableSelect 数据表格下拉框 编辑页面默认值
weixin_45180437:
mybatisPlus 枚举类注解 @EnumValue @JsonValue
哗啦啦啦~:
mybatisPlus 枚举类注解 @EnumValue @JsonValue
哗啦啦啦~:
【bug】Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguratio
SpringBoot找不到或无法加载主类