Java-8 addAll Objects

12

Java 8 中有更好的方法吗?

final List<InstitutionUserConnection> allInstitutionUserConnections = new ArrayList<>();
for (final Institution institution : institutionsOfUser) {
    allInstitutionUserConnections
        .addAll(institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution));
}
2个回答

11

是的,这就是flatMap操作的作用:

List<InstitutionUserConnection> allInstitutionUserConnections =
    institutionsOfUser.stream()
                      .flatMap(institution -> institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution).stream())
                      .collect(Collectors.toList());

如果该方法抛出已检查异常,则需要捕获并用日志记录进行处理,重新抛出未经检查的异常和/或返回默认值。

List<InstitutionUserConnection> allInstitutionUserConnections =
    institutionsOfUser.stream()
                      .flatMap(institution -> {
                          try {
                              return institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution).stream();
                          } catch (TheCheckedThrownException e) {
                              // do something here, like throw an unchecked exception
                          }
                      })
                      .collect(Collectors.toList());

institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution)抛出一个异常。还有没有处理的可能性?非常感谢! - quma

6

不必将内部列表平铺映射到一个流中,你也可以直接将其映射到List,然后使用自定义收集器来追加元素。使用收集器的优点在于,它消耗更少的性能,因为它使用了1个大的addAll调用,而不像Collectors.toList()那样使用单独的小的add调用。

基于此的解决方案如下:

List<InstitutionUserConnection> result = institutionsOfUser.stream().
        .map(institutionUserConnectionService::getActiveInstitutionUserConnectionsByInstitution)
        .collect(Collector.of(ArrayList::new, List::addAll,
                (left, right) -> { left.addAll(right); return left; }));

对于“addAll”的引用不明确,既可以匹配“addAll(Collection <? extends E>)”,也可以匹配“addAll(int,Collection <? extends E>)”。 - user1608790

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接