Генерация списков из списка - PullRequest
0 голосов
/ 25 сентября 2018

Я искал вокруг, и я не мог найти умный способ сделать разделение списка.

Допустим, у нас есть следующий пример:

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
}

Итак, яhave:

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"));

Можно ли как-нибудь сгенерировать два новых списка Person, используя группировку Stream API для мужчин и женщин?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Извините за краткость, но я еду на поезде домой.

Map<String, List<Person>> 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));
    }
}
0 голосов
/ 25 сентября 2018

На вашем месте я бы отправил 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]]}
...