Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java8流在某些条件下进行内部处理_Java_Java Stream - Fatal编程技术网

如何使用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
实例匹配?谢谢,我决定使用您的建议。非常好用谢谢,我决定采纳你的建议。完美地工作