如何在Java 8中压缩以下内容

5

一辆汽车(Car)有多个制造商,我想在一个 Set 中收集所有的制造商。

例如:

class Car {
    String name;
    List<String> manufactures;
}  

object sedan -> { ford, gm, tesla }
object sports -> { ferrari, tesla, bmw }
object suv -> { ford, bmw, toyota }

现在,我需要创建一个包含所有制造商(无冗余)的输出。
我尝试过:
carList.stream().map(c -> c.getManufacturers()).collect(Collectors.toSet());

这给了我一个 List Set ,但我需要消除嵌套并创建一个单一的 Set (非嵌套)。
[编辑] 如果某些对象的制造商具有“null”值,我们该如何防止NPE?
2个回答

5
使用flatMap
Set<String> manufactures =
    carList.stream()
           .flatMap(c -> c.getManufacturers().stream())
           .collect(Collectors.toSet());

如果想要避免Car出现null的制造商,请添加过滤器:

Set<String> manufactures =
    carList.stream()
           .filter(c -> c.getManufacturers() != null)
           .flatMap(c -> c.getManufacturers().stream())
           .collect(Collectors.toSet());

carList.stream() .flatMap(c -> c.getManufacturers().stream()) .filter(Objects::nonNull) .collect(Collectors.toSet()); - Hadi J
2
在应用filter(Objects::nonNull)之前,c.getManufacturers().stream()会抛出NullPointerException。 - Eran

0

仅出于简洁性使用方法引用的另一种变体是从 Car 映射到 List<String>,过滤掉 null 列表,展开流式流,最后收集到一个 Set 实现。

Set<String> resultSet =
          carList.stream()
                 .map(Car::getManufacturers)
                 .filter(Objects::nonNull)
                 .flatMap(List::stream)
                 .collect(Collectors.toSet());

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