如何在对象集合中根据对象的某个属性来对集合进行分组

我们经常在工作中会碰到这种情况:让我将对象结合中的对象按照对象的某个属性的值进行操作,然后根据值对集合中的对象进行分组。
这种情况听上去不是很难,但是在做起来的时候就会很麻烦。对不清楚Java8新特性的朋友来说,你可能会遍历数组对对象属性进行操作判断,然后在创建几个List对象去存储分组后的对象,这可能需要十几行代码。
然而今天,我们来学习一下Java8的其中一个新特性:集合的流式编程,让这种操作只要几行代码搞定。

一. 准备阶段

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<Person> 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<Boolean, List<Person>> collect = people.stream().collect(Collectors.groupingBy(l -> {
     
            Integer age = l.getAge();
            return age % 2 == 0;
        }));

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

List<Person> personList1 = collect.get(true);
        List<Person> 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<Integer, List<Person>> 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'}
...

通过这种方法,无论你对需要分组的属性值进行多复杂的计算或操作,只要最后他们返回的结果一致,他们就会分到一个组中,并且组名就是他们的返回值。
如果对你有用的话麻烦点个赞把。

你可能感兴趣的:(java)