使用Java8流为每个循环返回映射嵌套

使用Java8流为每个循环返回映射嵌套,java,java-8,java-stream,Java,Java 8,Java Stream,我刚开始使用Java 8和streams,但无法找到如何用Java 8编写此代码: Map<Integer, CarShop> result = new HashMap<>(); for (Car car : someListOfCars) { List<CarProduct> listOfCarProducts = car.getCarProducts(); for (CarProduct product : listOfCarPr

我刚开始使用Java 8和streams,但无法找到如何用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());
    }
}
Map result=newhashmap();
对于(汽车:一些汽车列表){
List listOfCarProducts=car.getCarProducts();
用于(CarProduct产品:CarProducts列表){
result.put(product.getId(),car.getCarShop());
}
}

有什么帮助吗?

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

Map<Integer, CarShop> result = someListOfCars.stream().collect(
        HashMap::new,
        (map, car) -> car.getCarProducts().forEach(
                prod -> map.put(prod.getId(), car.getCarShop())
        ),
        Map::putAll
);
Map result=someListOfCars.stream().collect(
HashMap::新建,
(地图,汽车)->car.getCarProducts().forEach(
prod->map.put(prod.getId(),car.getCarShop())
),
地图:putAll
);
您可以使解决方案更加灵活,但需要额外分配:

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));
Map result=someListOfCars.stream()
.flatMap(car->car.getCarProducts().stream())
.map(prod->newsimpleimutableentry(prod.getId(),car.getCarShop())
).collect(toMap(Map.Entry::getKey,Map.Entry::getValue,(a,b)->b));

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

我们能看看棘手的部分从哪里开始吗?还有你的
汽车
汽车产品
汽车商店
类看起来像什么(
Car.getCarProducts()
对我来说不是很直观)?汽车,而汽车商店只是虚构的。别担心这个领域。我尝试了不同版本的flatmap和Collector,以及map reduce,但我无法让它正常工作……我并不是说你的问题很糟糕,但如果我们准备好测试答案的代码,你不觉得回答这个问题会有帮助吗?一般来说,你们应该期望回答者和你们提问时付出同样的努力。谢谢,这很有效,让事情变得更清楚了。我确实尝试过类似的方法,但我想我还没有完全理解这些功能接口是如何工作的。。