Java-8 addAll对象

qum*_*uma 10 java java-8

在Java 8中有更好的方法吗?

final List<InstitutionUserConnection> allInstitutionUserConnections = new ArrayList<>();
for (final Institution institution : institutionsOfUser) {
    allInstitutionUserConnections
        .addAll(institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution));
}
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 9

是的,这是flatMap操作的目的:

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

如果该方法抛出已检查的异常,则需要捕获它并通过记录,重新抛出未经检查的异常和/或返回默认值来处理它.

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());
Run Code Online (Sandbox Code Playgroud)


Fer*_*big 5

您可以将内部列表平面映射到流,而不是将其直接映射到List,然后使用自定义收集器追加元素.使用上面使用流的收集器的优点是,使用收集器,你可以获得更高的性能,因为它使用1个大addAll调用,而不是add像这样的单独的小调用Collectors.toList().

基于此的解决方案如下:

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