【问题标题】:Filter nested lists and trasnform with streams in Java8在 Java 8 中过滤嵌套列表并使用流进行转换
【发布时间】:2021-05-05 13:27:02
【问题描述】:

我必须列出对象。我想在 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中编写下面的代码以避免嵌套循环?

谢谢!

【问题讨论】:

  • 你的getKey2() 对象不覆盖等于吗?它会比 compareTo (imho) 更清楚一些。
  • 虽然这是一个O(A*B) 解决方案,但groupingBylistDataAlistDataB 中使用Arrays.as(k1, k2, k3)max(O(A), O(B)) 运行时方法将为您提供Maps 进行迭代通过一个并在恒定时间内查找另一个以将元素添加到fusionList。 ** 你想在这里实现平等吗0 == dataA.getKey2().compareTo(dataB.getKey2())

标签: list java-8 java-stream nested-loops


【解决方案1】:

您可以使用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;
 }

【讨论】:

  • 不会将listDataB.stream().filter(Objects::nonNull) 带到外面并将其收集到一个列表中,然后在 listA 流的 forEach 中使用它会更好吗?
  • 我试试这个,但是当我返回列表时显示错误->“无法返回 void 结果”,我尝试使用 map 和 collect 但相同的结果...嵌入函数并返回 List
  • 首先我不喜欢在List 中有null 对象,OP 应该将非空对象收集到列表中,因为他有问题我只是在这里添加了它,其次这个解决方案是O(N*N) 我不喜欢,如果 OP 能提出 O(N) 或至少 O(N log N) 会更好
  • 我会建议发布与您面临的问题完全相同的问题,在上面的帖子中我没有看到返回列表@iptaboada 的返回声明
  • 我刚做了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多