首页 > 解决方案 > 从列表生成列表

问题描述

我一直在四处寻找,但找不到一种拆分列表的聪明方法。

假设我们有以下示例:

public class Person {
    private String name;
    private int age;
    private String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // Getters/setters
}

那么我有:

List<Person> personList = new ArrayList<>();
personList.add(new Person("Adam", 30, "male"));
personList.add(new Person("John", 32, "male"));
personList.add(new Person("Monica", 30, "female"));
personList.add(new Person("Sophia", 20, "female"));
personList.add(new Person("Carol", 25, "female"));

有没有一种方法可以使用 Stream API 对男性和女性进行分组来生成两个新的 Person 列表?

标签: javajava-8java-stream

解决方案


如果我是你,我会将其流式传输List并用于Collectors.partitioningBy将其收集到Map<Boolean, List<Person>>雄性true(或false)所在的位置,而雌性与雄性相反。就像下面这样简单:

personList.stream()
          .collect(Collectors.partitioningBy(person -> "male".equals(person.getGender())));

打印这将返回以下内容(实施后Person#toString):

{false=[Person [Name: Monica, Age: 30, Gender: female], Person [Name: Sophia, Age: 20, Gender: female], Person [Name: Carol, Age: 25, Gender: female]], true=[Person [Name: Adam, Age: 30, Gender: male], Person [Name: John, Age: 32, Gender: male]]}

推荐阅读