繁体   English   中英

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

[英]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());

这给了我一个ListSet ,但是我需要摆脱嵌套,而只创建一个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 mapList<String>filternull列表,展平流的流,然后最终收集到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM