是Java8收集器中的一种,与SQL的GROUP BY子句类似的功能。

1.1,分组

// 根据unitcode进行分组,将unitcode相同的CbhsHsunitInfEntity实体放入list中,
// 此时key是unitcode,value是list
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode));
}));

1.2,计数

// 根据unitcode进行分组,将unitcode相同的CbhsHsunitInfEntity实体放入list中,
// 此时key是unitcode,value是list.size()
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode,Collectors.counting()));

参考链接:java8 特性 - groupingBy

1.3,累和

// 根据unitcode进行分组,将unitcode相同的CbhsHsunitInfEntity实体放入list中,
// 此时key是unitcode,value是list中每个price的累和
Map<String, List<CbhsHsunitInfEntity>> unitMap = commonApiDao.getScrollData(CbhsHsunitInfEntity.class).getResultlist().stream().collect(Collectors.groupingBy(CbhsHsunitInfEntity::getUnitcode,Collectors.summingInt(CbhsHsunitInfEntity::getPrice)));

1.4,排序并打印数据

// 现在要按照map中value的数量逆序打印每个entry
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,toMap

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类型

// 输出一个map类型的数据,其中,unitcode为key值,levelcode2为value值
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&lt;String, List&lt;CbhsHsunitInfEntity&gt;&gt; unitMap = commonApiDao.getScrollData(CbhsHsunitInfEn
				
Java8中Collectors.groupingBy()处理后的Map乱序问题 一、问题说明: 在数据库中取出数据后,按数据的某一属性进行分组,但得到的分组是乱序的,并不是按数据库中的顺序排列的。 二、解决过程 查看Collectors.groupingBy()的源码,发现该方法是默认 HashMap ,其次 value 值为 ArrayList 返回的,而 HashMap 是无序的。 //默认HashMap返回 public static <T, K, A, D> Collector&lt
最近接触到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.toMapCollectors.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: 博主修改时使用tableSelect怎么回显呢 mybatisPlus 枚举类注解 @EnumValue @JsonValue 哗啦啦啦~: mybatisPlus 枚举类注解 @EnumValue @JsonValue 哗啦啦啦~: 你好请问下是做了什么转化吗,我的直接查出来展示的MAN/WoMAN 【bug】Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguratio SpringBoot找不到或无法加载主类