Collectors分组groupingBy用法

本文汇总了用户2135605的搜索记录,涉及测试、万能试验机、芒果等多主题,揭示了信息技术领域的兴趣点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据

{
    "statuscode": 200,
    "code": 200,
    "data": [
        {
            "UserID": 2135605,
            "ID": 100368,
            "Keyword": "测试"
        },
        {
            "UserID": 2135605,
            "ID": 107520,
            "Keyword": "万能试验机"
        },
        {
            "UserID": 2135605,
            "ID": 108191,
            "Keyword": "芒果"
        },
        {
            "UserID": 2135605,
            "ID": 108625,
            "Keyword": "塑料瓶"
        },
        {
            "UserID": 2135605,
            "ID": 108687,
            "Keyword": "巨峰蜂蜜"
        },
        {
            "UserID": 2135605,
            "ID": 109210,
            "Keyword": "湖人队提货人团队和"
        },
        {
            "UserID": 2135605,
            "ID": "1252638095514402816",
            "Keyword": "香蕉"
        },
        {
            "UserID": 2135605,
            "ID": "1253770116319936512",
            "Keyword": "苹果"
        }
    ],
    "success": true
}
        JSONObject object = JSON.parseObject(str);
        List<JSONObject> objects = object.getJSONArray("data").toJavaList(JSONObject.class);
        Map<Integer, String> collect = objects.stream().collect(Collectors.groupingBy(o -> o.getInteger("UserID"), Collectors.mapping(o -> o.getString("Keyword"), Collectors.joining(";"))));

结果

{2135605=测试;万能试验机;芒果;塑料瓶;巨峰蜂蜜;湖人队提货人团队和;香蕉;苹果}

### Java 中 `Collectors.groupingBy` 方法的用法 #### 基本概念 `Collectors.groupingBy` 是 Java Stream API 提供的一个强大的工具,用于按照指定的标准对流中的元素进行分组。它返回一个 `Collector` 实现,可以将输入数据按某个分类标准分成多个子集。 其基本形式如下: ```java public static Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier) ``` 这里的关键参数是一个函数类型的对象 `classifier`,该函数定义了如何根据每个元素计算出对应的键值[^1]。 --- #### 单层分组示例 下面展示了一个简单的单层分组例子: 假设有一个表示人的类 `Person`,其中包含姓名 (`name`) 和年龄 (`age`) 属性,则可以通过以下方式实现基于年龄的分组: ```java import java.util.*; import java.util.stream.Collectors; class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class GroupByExample { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 30) ); // 使用 Collectors.groupingBy 进行分组 Map<Integer, List<Person>> groupedByAge = people.stream() .collect(Collectors.groupingBy(Person::getAge)); // 输出结果 groupedByAge.forEach((age, persons) -> { System.out.println("Age: " + age); persons.forEach(person -> System.out.println(" - " + person.getName())); }); } } ``` 上述代码会输出每个人的姓名并将其按年龄分组。 --- #### 多级分组与下游收集器 除了基础的单层分组外,还可以通过提供第二个参数来执行多级分组或者应用其他统计方法。例如,在完成初步分组之后再计算每组内的平均值或其他聚合指标。 以下是利用 `groupingBy` 结合另一个收集器来进行复杂处理的例子——即先依据部门名称划分员工列表,然后再分别获取各部门薪资总额的情况说明: ```java Map<String, Integer> totalSalaryPerDepartment = employees.stream() .collect(Collectors.groupingBy(Employee::getDepartment, Collectors.summingInt(Employee::getSalary))); ``` 此片段展示了如何一次性获得各个部门及其对应总薪水的信息表结构[^2]。 另外还有更灵活的方式允许我们自定义最终容器类型以及映射规则等选项存在;比如当希望得到的是字符串集合而非原始实体对象组成的数组时可采用如下写法: ```java Map<Integer, List<String>> namesByAge = exampleList.stream() .collect(Collectors.groupingBy(TestDailyOne::getAge, Collectors.mapping(TestDailyOne::getName, Collectors.toList()))); namesByAge.forEach((k,v)->{ System.out.println("Key:"+k+", Value:"+v); }); ``` 这段程序能够把测试样例里的条目依照它们各自的岁数值加以整理成名字清单的形式呈现出来[^3]。 --- ### 总结 综上所述,`Collectors.groupingBy()` 不仅能单独作为顶层调用来创建简单映射关系图谱,而且还能配合额外配置项达成更加精细的数据加工需求满足实际应用场景下的多样化要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值