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怎么办?
答案 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)
仅使用方法参考的另一种变体是简洁性,从map
到Car
List<String>
,filter
列出null
列表,展平流然后最终收集到一个Set实现。
Set<String> resultSet =
carList.stream()
.map(Car::getManufacturers)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(Collectors.toSet());