Java 从列表生成列表

Java 从列表生成列表,java,java-8,java-stream,Java,Java 8,Java Stream,我一直在四处搜索,但我找不到一个聪明的方法来拆分列表 假设我们有以下示例: 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; t

我一直在四处搜索,但我找不到一个聪明的方法来拆分列表

假设我们有以下示例:

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"));
List personList=new ArrayList();
添加(新人物(“亚当”,30岁,“男性”);
personList.add(新人(“约翰”,32岁,“男性”);
人物列表。添加(新人物(“莫妮卡”,30岁,“女性”);
添加(新人物(“索菲亚”,20岁,“女性”);
添加(新的人(“卡罗尔”,25岁,“女性”);

有没有一种方法可以让我使用流API将男性和女性分组来生成两个新的人员列表?

如果我是你,我会流式处理
列表
,并使用
收集器。Partitioning By
将其收集到
地图
,其中男性是
true
(或
false
),而雌性与雄性相反。简单如下:

personList.stream()
          .collect(Collectors.partitioningBy(person -> "male".equals(person.getGender())));
打印此内容将返回以下内容(在执行
Person#toString
后):


很抱歉这么简单,我正在回家的火车上

Map<String, List<Person>> map = list.stream()
    .collect(Collectors.groupingBy(Person::getGender));
Map Map=list.stream()
.collect(Collectors.groupingBy(Person::getGender));
代码呢

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

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

    // getters and setters
}

public class GroupBy {

    public static void main(String[] args) {

        List<Person> list = ArrayList();

        liist.add(new Person("Adam", 30, male));
        list.add(new Person("John", 32, male));
        list.add(new Person("Monica", 30, female));
        list.add(new Person("Sophia", 20, female));
        list.add(new Person("Carol", 25, female));

        Map<String, List<Person>> map = list.stream()
            .collect(Collectors.groupingBy(Person::getGender));
    }
}
公共类人物{
私有字符串名称;
私人互联网;
私人弦乐体裁;
公众人物(字符串名称、整数年龄、字符串类型){
this.name=名称;
这个。年龄=年龄;
这个。流派=流派;
}
//接球手和接球手
}
公共类分组{
公共静态void main(字符串[]args){
List=ArrayList();
liist.add(新人(“亚当”,30岁,男性));
增加(新人(“约翰”,32岁,男性));
增加(新人(“莫妮卡”,30岁,女性));
增加(新人(“索菲亚”,20岁,女性));
增加(新人(“卡罗尔”,25岁,女性));
Map=list.stream()
.collect(Collectors.groupingBy(Person::getGender));
}
}

背上你的答案,因为
partitioning by
使用谓词,OP也可以声明
谓词gender=person->“male”.equals(person.gender())。然后流变成
collect(Collectors.partitioning by(gender))
。如果只关注单一性别,则应将谓词称为目标性别(或者只应使用
groupingBy
)@user991710或使用
groupingBy(Person::gender)
public class Person {
    private String name;
    private int age;
    private String genre;

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

    // getters and setters
}

public class GroupBy {

    public static void main(String[] args) {

        List<Person> list = ArrayList();

        liist.add(new Person("Adam", 30, male));
        list.add(new Person("John", 32, male));
        list.add(new Person("Monica", 30, female));
        list.add(new Person("Sophia", 20, female));
        list.add(new Person("Carol", 25, female));

        Map<String, List<Person>> map = list.stream()
            .collect(Collectors.groupingBy(Person::getGender));
    }
}