使用Java8流为每个循环返回映射嵌套
我刚开始使用Java 8和streams,但无法找到如何用Java 8编写此代码:使用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
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,但我无法让它正常工作……我并不是说你的问题很糟糕,但如果我们准备好测试答案的代码,你不觉得回答这个问题会有帮助吗?一般来说,你们应该期望回答者和你们提问时付出同样的努力。谢谢,这很有效,让事情变得更清楚了。我确实尝试过类似的方法,但我想我还没有完全理解这些功能接口是如何工作的。。