首页 > 解决方案 > 过滤嵌套列表并使用 Java8 中的流进行转换

问题描述

我必须列出对象。我想在 ListB 中找到 ListA 的关键元素,然后调用一个融合数据的函数。我有这个:

public List<CarDto> transformData(List<CarDto> listDataA,List<CarDto> listDataB){

    List<CarDto> fusionList = new ArrayList<CarDto>();      

    for(CarDto carDtoDataA:listDataA) {
        for(CarDto carDtoDataB:listDataB) {
            if(null != carDtoDataA && null != carDtoDataB
                    && carDtoDataA.getKey1().equals(carDtoDataB.getKey1())                      
                    && 0==carDtoDataA.getKey2().compareTo(carDtoDataB.getKey2())
                    && carDtoDataA.getKey3().equals(carDtoDataB.getKey3())) {
                fusionList.add(this.fusionDataAB(carDtoDataA,carDtoDataB));
            }
        }
    }
    return fusionList;
}

如何使用流在 java 8 中编写以下代码以避免嵌套循环?

谢谢!

标签: listjava-8java-streamnested-loops

解决方案


您可以使用forEach并使用filter对象属性的条件来执行此操作

public List<CarDto> transformData(List<CarDto> listDataA,List<CarDto> listDataB){

  List<CarDto> fusionList = new ArrayList<CarDto>();     

  listDataA.stream()
           .filter(Objects::nonNull)
           .forEach(objA-> listDataB.stream()
                           .filter(Objects::nonNull)
                           .filter(objB-> objA.getKey1().equals(objB.getKey1()))
                           .filter(objB-> objA.getKey2().compareTo(objB.getKey2()) == 0)
                           .filter(objB-> objA.getKey3().equals(objB.getKey3()))
                           .forEach(objB->fusionList.add(this.fusionDataAB(objA, objB)))); 


    return fusionList;
 }

推荐阅读