java两个不同实体列表聚合_java list分组聚合

本文展示了如何使用Java 8的Stream API对包含Person实体的列表进行分组和聚合操作,包括按年龄分组并计算工资总和、平均值等统计信息。
摘要由CSDN通过智能技术生成

废话不多说所直接上代码

1. 只对某个属性分组 (personsList为存储实体类的集合)

group by age

Map> map = personsList.stream().collect(Collectors.groupingBy(Person::getAge));

结果:

022563f2ff945da6c6545b385cb73243.png

2.先分组,再获取所有聚合统计的参数

Map collect = persons.stream().collect(

Collectors.groupingBy(Person::getAge,

Collectors.summarizingDouble(Person::getSalary)));

结果:

bddc5ff553fdca534daaaaa8010e2c13.png

3.先分组,然后对工资聚合

sum(salary)

group by age

Mapcollect1 = persons.stream().collect(

Collectors.groupingBy(Person::getAge, Collectors.summingDouble(Person::getSalary)));

结果:

637066912b22546583469a76cbea7424.png

整体代码总体如下:

import java.util.*;

import java.util.stream.Collectors;

public class Test {

public static void main(String[] args) {

List persons = new ArrayList<>();

persons.add(new Person("Brandon", 15, 5000));

persons.add(new Person("Braney", 15, 15000));

persons.add(new Person("Jack", 10, 5000));

persons.add(new Person("Robin", 10, 500000));

persons.add(new Person("Tony", 10, 1400000));

// 只对 age 分组

Map> map = persons.stream().collect(Collectors.groupingBy(Person::getAge));

for (Map.Entry> entry : map.entrySet()) {

System.out.println("分组" +entry);

}

System.out.println("=======================");

// 对age分组 然后取所有的聚合结果集

Map collect = persons.stream().collect(

Collectors.groupingBy(Person::getAge,

Collectors.summarizingDouble(Person::getSalary)));

for (Map.Entry entry : collect.entrySet()) {

DoubleSummaryStatistics longSummaryStatistics = entry.getValue();

System.out.println("----------------key----------------" + entry.getKey());

System.out.println("求和:" + longSummaryStatistics.getSum());

System.out.println("求平均" + longSummaryStatistics.getAverage());

System.out.println("求最大:" + longSummaryStatistics.getMax());

System.out.println("求最小:" + longSummaryStatistics.getMin());

System.out.println("求总数:" + longSummaryStatistics.getCount());

}

System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

// 对age分组 然后取求和结果集

Map collect1 = persons.stream().collect(

Collectors.groupingBy(Person::getAge, Collectors.summingDouble(Person::getSalary)));

System.out.println(collect1);

System.out.println("1");

}

}

结果:

分组10=[Person [name=Jack, age=10, salary=5000.0], Person [name=Robin, age=10, salary=500000.0], Person [name=Tony, age=10, salary=1400000.0]]

分组15=[Person [name=Brandon, age=15, salary=5000.0], Person [name=Braney, age=15, salary=15000.0]]

=======================

----------------key----------------10

求和:1905000.0

求平均635000.0

求最大:1400000.0

求最小:5000.0

求总数:3

----------------key----------------15

求和:20000.0

求平均10000.0

求最大:15000.0

求最小:5000.0

求总数:2

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

{10=1905000.0, 15=20000.0}

1

实体类

/**

* 要聚合的实体类

/

class Person {

private String name;

private int age;

private double salary;

public Person(String name, int age, double salary) {

super();

this.name = name;

this.age = age;

this.salary = salary;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public double getSalary() {

return salary;

}

public void setSalary(double salary) {

this.salary = salary;

}

public String getNameAndAge() {

return this.getName() + "-" + this.getAge();

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + ", salary=" + salary

+ "]";

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值