利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式

简介: 利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式

      举个例子吧,目前的业务需要把取到的数据,进行分组,然后好用另一个方法进行数据处理。

     用到的方法就是 Collectors.groupingBy,Collectors.counting(),  Collectors.reducing()。

    然后,就以下面的为例子,将取到的list集合,将取到的数据以性别分组,以性别为K,以性别数量为v,。

代码示例:
package Lx;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StreamLiu {
  public static void main(String[] args) {
        // 假设有三个包含对象的list链表
        List<Person> list1 = new ArrayList<>();
        Person person = new Person();
        person.setIdCard("100001");
        person.setName("张三");
        person.setAge("M");
        list1.add(person);
        // 向list1中添加一些Person对象
        List<Person> list2 = new ArrayList<>();
        // 向list2中添加一些Person对象
        Person person2 = new Person();
        person2.setIdCard("100002");
        person2.setName("李四");
        person2.setAge("M");
        list2.add(person2);
        List<Person> list3 = new ArrayList<>();
        // 向list3中添加一些Person对象
        Person person3 = new Person();
        person3.setIdCard("100003");
        person3.setName("赵芳");
        person3.setAge("W");
        list3.add(person3);
        // 将这三个链表合并成一个总的链表
        List<Person> totalList = new ArrayList<>();
        totalList.addAll(list1);
        totalList.addAll(list2);
        totalList.addAll(list3);
        //要求:将totalList转变成以性别为主键,性别数量为value的集合
        /***方法一--start***/
        Map<String, Integer> result =  totalList.stream().collect(Collectors.groupingBy(
            Person::getAge,
                Collectors.reducing(0, e -> 1, Integer::sum)
        ));
        System.out.println("reult "+result);
        /***方法二--start***/
        Map<String, Long> result2 =   totalList.stream().collect(Collectors.groupingBy(
            Person::getAge,
                Collectors.counting()
                ));
        System.out.println("reult "+result);
    }
}
class Person {
    private String idCard;
    // 其他属性和方法
    private String name;
    //性别1男2女
    private String age;
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
    // 其他getter和setter方法
    public String getAge() {
    return age;
  }
  public void setAge(String age) {
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
    public String toString() {
        return "Person{" +
                "idCard='" + idCard + '\'' +
                // 其他属性
                '}';
    }
}
打印结果:

关键代码分析:
方法一:
/***方法一--start***/
        Map<String, Integer> result =  totalList.stream().collect(Collectors.groupingBy(
            Person::getAge,
                Collectors.reducing(0, e -> 1, Integer::sum)
        ));

 这段代码使用Java 8中的Stream API将一个`List`中的对象按照`Person`对象的`age`属性进行分组,并计算每个分组中的元素个数,并将结果存储在一个`Map`中返回。具体来说,代码中使用了`Collectors.groupingBy`方法和`Collectors.reducing`方法,分别表示对列表进行分组和规约(计算)操作。

以下是详细的解析:

1. `totalList.stream()`:将`totalList`转换为`Stream`对象,以便使用Stream API进行操作。

2. `Collectors.groupingBy(Person::getAge, Collectors.reducing(0, e -> 1, Integer::sum))`:对`totalList`中的元素按照`Person`对象的`age`属性进行分组,并计算每个分组中的元素个数。

   * `Person::getAge` 指定了按照`Person`对象的`age`属性进行分组,即将具有相同`age`属性的元素分为同一组。

   

   * `Collectors.reducing`方法指定每个分组中元素的计算方式。在本例中,将每个分组中的元素规约(计算)为它们数量的和。 具体来说,`Collectors.reducing(0, e -> 1, Integer::sum)`中:

       * `0` 表示初始值,即每个分组的元素数量的初始值为0。

       

       * `e -> 1` 是一个Lambda表达式,表示将每个元素映射为`1`,即对每个元素计数。

       

       * `Integer::sum` 指定了将所有映射为`1`的元素相加的操作,即将每个分组中的元素数量相加。

       

   通过这样的规约操作,将每个分组的元素数量计算出来。

3. 由于`Collectors.groupingBy`方法的返回值为`Map<K,List<V>>`类型,即一个分组名和分组元素列表的映射关系。而在本例中,分组名为`String`类型,表示`Person`对象的`age`属性的取值,元素数量为`Integer`类型,表示每个分组中元素的数量。因此,最终返回的类型为`Map<String, Integer>`。

方法二:(因为方法二value是Long类型,所以直接用Collectors.counting()可以)
/***方法二--start***/
        Map<String, Long> result2 =   totalList.stream().collect(Collectors.groupingBy(
            Person::getAge,
                Collectors.counting()
                ));

这段代码使用Java 8中的Stream API将一个`List`中的对象按照`Person`对象的`age`属性进行分组,并计算每个分组中的元素个数,并将结果存储在一个`Map`中返回。具体来说,代码中使用了`Collectors.groupingBy`方法和`Collectors.counting`方法,分别表示对列表进行分组和计数操作。

以下是详细的解析:

1. `totalList.stream()`:将`totalList`转换为`Stream`对象,以便使用Stream API进行操作。

2. `Collectors.groupingBy(Person::getAge, Collectors.counting())`:对`totalList`中的元素按照`Person`对象的`age`属性进行分组,并计算每个分组中的元素个数。

   * `Person::getAge` 指定了按照`Person`对象的`age`属性进行分组,即将具有相同`age`属性的元素分为同一组。

   

   * `Collectors.counting()` 方法用于计算每个分组中的元素个数。

   

   通过这样的操作,将每个分组的元素数量计算出来。

3. 由于`Collectors.groupingBy`方法的返回值为`Map<K,List<V>>`类型,即一个分组名和分组元素列表的映射关系。而在本例中,分组名为`String`类型,表示`Person`对象的`age`属性的取值,元素数量为`Long`类型,表示每个分组中元素的数量。因此,最终返回的类型为`Map<String, Long>`。

相关文章
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
360 0
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
2127 7
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
595 1
|
TensorFlow 算法框架/工具 Python
从numpy,list对象创建
【8月更文挑战第12天】从numpy,list对象创建。
107 8
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
211 5
|
Python
Python量化炒股的获取数据函数— get_billboard_list()
Python量化炒股的获取数据函数— get_billboard_list()
313 0
|
存储 Java 索引
Java 中 List、Set、Map 和 Queue 之间的区别
【8月更文挑战第22天】
511 0
|
Python
【Pandas】Pandas的DataFrame按行插入list数据或者读取一行并存为csv文件
本文提供了使用Pandas库对DataFrame进行操作的示例代码。
943 0
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
存储 语音技术 Python
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)

热门文章

最新文章