如何迭代POJO类列表以便以标准方式收集某些方法的结果以避免复制过去? 我想要这样的代码:
//class 'Person' has methods: getNames(), getEmails()
List<Person> people = requester.getPeople(u.getId());
String names = merge(people, Person::getNames);
String emails = merge(people, Person::getEmails);
而不是这样的复制粘贴逻辑:
List<Person> people = requester.getPeople(u.getId());
Set<String> namesAll = new HashSet<>();
Set<String> emailsAll = new HashSet<>();
for (Person p : people) {
if(p.getNames()!=null) {
phonesAll.addAll(p.getNames());
}
if(p.getEmails()!=null) {
emailsAll.addAll(p.getEmails());
}
}
String names = Joiner.on(", ").skipNulls().join(namesAll);
String emails = Joiner.on(", ").skipNulls().join(emailsAll);
因此,是否有可能实现一些标准方法来迭代和处理可以重用的列表中POJO的特殊方法?
答案 0 :(得分:3)
如果我理解正确,你需要这样的东西:
String names = people.stream().flatMap(p->p.getNames().stream()).distinct().collect(Collectors.joining(", "));
现在,如果您想为每个属性保存该行的输入,您可以按照建议使用此merge
方法:
public static String merge (List<Person> people, Function<Person, Collection<String>> mapper)
{
return people.stream().flatMap(p->mapper.apply(p).stream()).distinct().collect(Collectors.joining(", "));
}
这将使您的第一个代码段工作。
现在,您可以将此方法设为通用:
public static <T> String merge (List<T> list, Function<T, Collection<String>> mapper)
{
return list.stream().flatMap(p->mapper.apply(p).stream()).distinct().collect(Collectors.joining(", "));
}
我认为这应该有效(没有测试过)。