Фильтрация объектов из заданного списка по общим критериям с использованием потоков Java - PullRequest
0 голосов
/ 23 мая 2018

У меня есть требование выбрать подсписок из заданного суперсписка, как объяснено ниже.

Допустим, у меня есть суперсписок объектов "Person" следующим образом:

List<Person> personsList = new ArrayList<>();
personsList.add(new Person("John", 28));
personsList.add(new Person("Paul", 29));
personsList.add(new Person("Adam", 30));
personsList.add(new Person("Peter", 31));
personsList.add(new Person("Kate", 32));
personsList.add(new Person("John", 67));
personsList.add(new Person("Paul", 68));
personsList.add(new Person("Adam", 69));

Пусть класс Person будет определен следующим образом:

class Person {
    public String name;
    public int age;

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

    @Override
    public String toString() {
        return name + ": " + age;
    }
}

Используя API Java Streams, как мне получить подсписок с записями, как показано ниже (обратите внимание, что повторяющиеся экземпляры объектов с одинаковыми именами должны бытьизвлечено):

John : 28
John : 67
Paul : 29
Paul : 68
Adam : 30
Adam : 69

Может кто-нибудь помочь мне в достижении этого с помощью Java 8 Streams API?

PS: я бы не знал заранее, какие значения существуют в качестве имен для этих объектов.

1 Ответ

0 голосов
/ 23 мая 2018

Следующая операция даст вам ожидаемый результат.Вы сначала группируете по имени все ваши персоны, из полученного списка вы исключаете всех с размером менее 2 и flatMap все, сортируете и печатаете все

personsList.stream()      
       .collect(Collectors.groupingBy(Person::getName))
       .values()
       .stream()
       .filter(list -> list.size() > 1)
       .flatMap(List::stream)
       .forEach(System.out::println);

Выход

Adam: 30
Adam: 69
John: 28
John: 67
Paul: 29
Paul: 68
...