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

Jav*_*per 5 java java-8

A Car有多个制造商,我想收集所有制造商Set.

例如:

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

object sedan -> { ford, gm, tesla }
object sports -> { ferrari, tesla, bmw }
object suv -> { ford, bmw, toyota }
Run Code Online (Sandbox Code Playgroud)

现在,我需要创建包含所有制造商的输出(没有冗余)

我试过了:

carList.stream().map(c -> c.getManufacturers()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

这给了我SetListS,但我需要摆脱嵌套的,只是建立一个单一的Set(非嵌套).

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

Era*_*ran 5

用途flatMap:

Set<String> manufactures =
    carList.stream()
           .flatMap(c -> c.getManufacturers().stream())
           .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

如果你想避免Car具有S- null制造,添加过滤器:

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

  • @HadiJeddizahed`c.getManufacturers().stream()`将在应用`filter(objects :: nonNull)`之前抛出NullPointerException. (2认同)