[英]How to condense the following in 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());
这给了我一个List
的Set
,但是我需要摆脱嵌套,而只创建一个Set
(非nested)。
[编辑]如果某些对象对制造商而言具有“空”值并且我们要防止NPE怎么办?
使用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());
仅出于简洁目的使用方法引用的另一个变体是从Car
map
到List<String>
, filter
出null
列表,展平流的流,然后最终收集到Set实现。
Set<String> resultSet =
carList.stream()
.map(Car::getManufacturers)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(Collectors.toSet());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.