为每个循环嵌套返回带有Java 8流的映射

Cod*_*r07 5 java java-8 java-stream

我刚开始使用Java 8和流,并且无法找到如何在Java 8中编写此代码:

Map<Integer, CarShop> result = new HashMap<>();     
for (Car car : someListOfCars) {
    List<CarProduct> listOfCarProducts = car.getCarProducts();
    for (CarProduct product : listOfCarProducts) {
        result.put(product.getId(), car.getCarShop());
    }
}
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Mis*_*sha 9

您通常可以使用以下方法将迭代解决方案直接转换为流 .collect:

Map<Integer, CarShop> result = someListOfCars.stream().collect(
        HashMap::new,
        (map, car) -> car.getCarProducts().forEach(
                prod -> map.put(prod.getId(), car.getCarShop())
        ),
        Map::putAll
);
Run Code Online (Sandbox Code Playgroud)

您可以以额外分配为代价使解决方案更加灵活:

Map<Integer, CarShop> result = someListOfCars.stream()
        .flatMap(car -> car.getCarProducts().stream()
                .map(prod -> new SimpleImmutableEntry<>(prod.getId(), car.getCarShop()))
        ).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b));
Run Code Online (Sandbox Code Playgroud)

这将允许您以任何方式收集.例如,(a,b)->b如果存在重复的ID而不是静默覆盖条目,则可以删除以强制执行异常.