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

时间:2018-01-10 15:34:46

标签: java java-8

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());

这给了我一个Set List个,但我需要摆脱嵌套,只需创建一个Set(非嵌套)。

[编辑]如果某些对象对制造商有'空'值并且我们想要阻止NPE怎么办?

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

仅使用方法参考的另一种变体是简洁性,从mapCar List<String>filter列出null列表,展平流然后最终收集到一个Set实现。

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