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

时间:2018-05-23 17:45:30

标签: java java-8 java-stream

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

假设我有一个“人物”对象的超级列表,如下所示:

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;
    }
}

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

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

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

P.S:我不会事先知道那些物品的名称是什么值。

1 个答案:

答案 0 :(得分:6)

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

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