跨出边界
发布于 2024-01-10 / 33 阅读 / 0 评论 / 0 点赞

Java lambda技巧-list按指定属性分组2

Java lambda技巧-list按指定属性分组2

如果你想在分组时同时获取age和name属性,你可以使用Collectors.groupingBy()方法的另一个重载版本,并使用Collectors.mapping()方法来收集属性值。下面是修改后的示例代码:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ListGroupingExample {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person("Alice", 25),
                new Person("Bob", 30),
                new Person("Charlie", 25),
                new Person("Dave", 30)
        );

        Map<Integer, List<String>> ageNameMap = personList.stream()
                .collect(Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.toList())));

        ageNameMap.forEach((age, names) -> {
            System.out.println("Age: " + age);
            System.out.println("Names: " + names);
            System.out.println();
        });
    }
}

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;
    }
}

在上述代码中,我们使用Collectors.mapping()方法来将Person对象的name属性收集到一个列表中。mapping()方法接受两个参数,第一个参数是属性的提取函数,第二个参数是用于收集属性值的收集器。在这个例子中,我们使用Person::getName作为属性的提取函数,并使用Collectors.toList()作为收集器,将属性值收集到一个列表中。

运行上述代码,将输出以下结果:

Age: 25
Names: [Alice, Charlie]

Age: 30
Names: [Bob, Dave]

这里我们按照年龄将Person对象分成了两个组,并获取了每个组中的name属性值列表。


评论