使用Java Streams使用通用条件筛选给定列表中的对象

Rav*_*avi 2 java java-8 java-stream

我需要从给定的超级列表中获取子列表,如下所述.

假设我有一个"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));
Run Code Online (Sandbox Code Playgroud)

让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;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用Java Streams API,如何获取包含以下条目的子列表(请注意,必须获取具有相同名称的对象的重复实例):

John : 28
John : 67
Paul : 29
Paul : 68
Adam : 30
Adam : 69
Run Code Online (Sandbox Code Playgroud)

有人可以通过使用Java 8 Streams API帮助我实现这一目标吗?

PS:我不会事先知道那些对象的名称是什么值.

Yas*_*jaj 6

以下操作将为您提供等待结果.您首先按名称对所有人进行分组,从结果列表中排除所有大小小于2的人并将flatMap排序,排序并打印所有内容

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

产量

Adam: 30
Adam: 69
John: 28
John: 67
Paul: 29
Paul: 68
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用方法引用:`.flatMap(List :: stream)`如果你正在排序,`.sorted(Comparator.comparing(Person :: getName))`. (2认同)