如何使用Java8流在某些条件下进行内部处理
我有以下代码:如何使用Java8流在某些条件下进行内部处理,java,java-stream,Java,Java Stream,我有以下代码: List<SoldProduct> soldProducts = new ArrayList<>(); for (Product product : products) { for (ProductCartDTO productCartDTO : dto.getProducts()) { if(product.getId().equals(productCartDTO.getIdProduct())){
List<SoldProduct> soldProducts = new ArrayList<>();
for (Product product : products) {
for (ProductCartDTO productCartDTO : dto.getProducts()) {
if(product.getId().equals(productCartDTO.getIdProduct())){
soldProducts.add(new SoldProduct(product, productCartDTO.getSerialList()));
}
}
}
List soldProducts=new ArrayList();
用于(产品:产品){
for(ProductCartDTO ProductCartDTO:dto.getProducts()){
if(product.getId().equals(productCartDTO.getIdProduct())){
添加(新的SoldProduct(product,productCartDTO.getSerialList());
}
}
}
我尝试了很多次,但是在Java8流中没有得到相同的结果
有可能得到流的这种精确行为吗?如果是,请给我举个例子
感谢两个列表的笛卡尔连接,以查找具有匹配产品id的对象,这对性能非常不利 建议您构建一个
地图
,当然假设只有一个产品具有给定的id
Map<Integer, Product> productById =
products.stream()
.collect(Collectors.toMap(Product::getId, Function.identity()));
List<SoldProduct> soldProducts =
dto.getProducts()
.stream()
.filter(d -> productById.containsKey(d.getIdProduct()))
.map(d -> new SoldProduct(productById.get(d.getIdProduct()), d.getSerialList()))
.collect(Collectors.toList());
两个列表的笛卡尔连接用于查找具有匹配产品id的对象,这对性能非常不利 建议您构建一个
地图
,当然假设只有一个产品具有给定的id
Map<Integer, Product> productById =
products.stream()
.collect(Collectors.toMap(Product::getId, Function.identity()));
List<SoldProduct> soldProducts =
dto.getProducts()
.stream()
.filter(d -> productById.containsKey(d.getIdProduct()))
.map(d -> new SoldProduct(productById.get(d.getIdProduct()), d.getSerialList()))
.collect(Collectors.toList());
正如@Andreas所说,您的嵌套循环方法不是很有效,但以下是如何将其转换为流:
List<SoldProduct> soldProducts = products.stream()
.flatMap(product -> dto.getProducts()
.stream()
.filter(productCartDTO -> product.getId().equals(productCartDTO.getIdProduct()))
.map(ProductCartDTO::getSerialList)
.map(serialList -> new SoldProduct(product, serialList)))
.collect(Collectors.toList());
List soldProducts=products.stream()
.flatMap(产品->dto.getProducts()
.stream()
.filter(productCartDTO->product.getId().equals(productCartDTO.getIdProduct())
.map(ProductCartDTO::getSerialList)
.map(serialList->new SoldProduct(产品,serialList)))
.collect(Collectors.toList());
正如@Andreas所说,嵌套循环方法效率不高,但下面介绍如何将其转换为流:
List<SoldProduct> soldProducts = products.stream()
.flatMap(product -> dto.getProducts()
.stream()
.filter(productCartDTO -> product.getId().equals(productCartDTO.getIdProduct()))
.map(ProductCartDTO::getSerialList)
.map(serialList -> new SoldProduct(product, serialList)))
.collect(Collectors.toList());
List soldProducts=products.stream()
.flatMap(产品->dto.getProducts()
.stream()
.filter(productCartDTO->product.getId().equals(productCartDTO.getIdProduct())
.map(ProductCartDTO::getSerialList)
.map(serialList->new SoldProduct(产品,serialList)))
.collect(Collectors.toList());
是否为产品
和dto.getProducts()
列表?是否可以有多个ProductCartDTO
实例与同一Product
实例匹配?是否有products
和dto.getProducts()
列表?是否有多个productcardto
实例与同一Product
实例匹配?谢谢,我决定使用您的建议。非常好用谢谢,我决定采纳你的建议。完美地工作