繁体   English   中英

使用功能接口(lambda)从POJO列表中收集值

[英]Collect values from list of POJO using Functional interfaces (lambdas)

如何以标准方式迭代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的特殊方法?

如果我对您的理解正确,那么您需要这样的东西:

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(", "));
}

我认为这应该工作(尚未测试)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM