我需要从给定的超级列表中获取子列表,如下所述。
假设我有一个“人物”对象的超级列表,如下所示:
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:我不会事先知道那些物品的名称是什么值。
答案 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