Java List对象根据对象属性分组或分组汇总,返回map 使用java8中的集合的流式编程

逻辑代码如下:查询到的是一个list集合,根据workerId,转化成 以workerId为Key,以具有同样workerId的List作为value 的map 

 List details = logDAO.selectList();
        Map> detailMap = new HashMap<>();
        if (details!=null&& details.size()>0){
            detailMap = details.stream().collect(Collectors.groupingBy(e -> e.getWorkerId()));
 }

转载https://blog.csdn.net/weixin_48872249/article/details/111789489

一. 准备阶段
1.准备好一个实体类

public class Person{
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

2.准备好一个集合

ArrayList people = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            Person person = new Person();
            person.setAge(i);
            String l = i % 2 == 0 ? "偶数" : "奇数";
            person.setName(l+"-"+i);
            people.add(person);
        }

这里我循环插入了一百个对象,对象的age直接赋值为每次循环的i值,name值则为当前i是否为偶数再加上“-”和当前i的值。

二. 实操阶段
操作一:对person的age属性进行操作,将根据age的奇偶性进行分组

Map> collect = people.stream().collect(Collectors.groupingBy(l -> {
            Integer age = l.getAge();
            return age % 2 == 0;
        }));

好了,分完组后,他会返回一个Map集合,key值是分组的所依据的值,value就是分好组后的集合,接下来让我看看结果

List personList1 = collect.get(true);
        List personList2 = collect.get(false);
        personList1.forEach(System.out::println);
        System.out.println("===============");
        personList2.forEach(System.out::println);

Person{age=2, name='偶数-2'}
Person{age=4, name='偶数-4'}
Person{age=6, name='偶数-6'}
Person{age=8, name='偶数-8'}
...
===============
Person{age=1, name='奇数-1'}
Person{age=3, name='奇数-3'}
Person{age=5, name='奇数-5'}
Person{age=7, name='奇数-7'}
Person{age=9, name='奇数-9'}
...

这里由于每个集合中都有50个对象,所以我就挑了前面几条进行展示。

操作二:在name中获得“-”后的数字,并根据其对5取余的值进行分组

Map> collect = people.stream().collect(Collectors.groupingBy(l -> {
            String name = l.getName();
            String[] split = name.split("-");
            int parseInt = Integer.parseInt(split[1]);
            return parseInt % 5;
        }));

Person{age=5, name='奇数-5'}
Person{age=10, name='偶数-10'}
Person{age=15, name='奇数-15'}
Person{age=20, name='偶数-20'}
...
============
Person{age=1, name='奇数-1'}
Person{age=6, name='偶数-6'}
Person{age=11, name='奇数-11'}
Person{age=16, name='偶数-16'}
============
Person{age=2, name='偶数-2'}
Person{age=7, name='奇数-7'}
Person{age=12, name='偶数-12'}
Person{age=17, name='奇数-17'}
...
============
Person{age=3, name='奇数-3'}
Person{age=8, name='偶数-8'}
Person{age=13, name='奇数-13'}
Person{age=18, name='偶数-18'}
...
============
Person{age=4, name='偶数-4'}
Person{age=9, name='奇数-9'}
Person{age=14, name='偶数-14'}
Person{age=19, name='奇数-19'}
...

原文链接:https://blog.csdn.net/Man20161217/article/details/82657698

1,跟据某个属性分组OfficeId

 Map> collect = list.stream().collect(Collectors.groupingBy(IncomeSumPojo::getOfficeId));

2,根据某个属性分组OfficeId,汇总某个属性Money

Map collect = list.stream().collect(Collectors.groupingBy(IncomeSumPojo::getOfficeId,Collectors.summingDouble(IncomeSumPojo::getMoney)));

3,根据某个属性添加条件过滤数据,

list = list.stream().filter(u -> !u.getAmount().equals("0.00")).collect(Collectors.toList());

4,判断一组对象里面有没有属性值是某个值

List

menuList = UserUtils.getMenuList();
boolean add = menuList.stream().anyMatch(m -> "plan:ctPlan:add".equals(m.getPermission()));

5,取出一组对象的某个属性组成一个新集合

List tableNames=list.stream().map(User::getMessage).collect(Collectors.toList());

6,list去重复

list = list.stream().distinct().collect(Collectors.toList());

你可能感兴趣的:(Java)