list - 过滤嵌套列表并使用 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 中编写以下代码以避免嵌套循环?
谢谢!
解决方案
您可以使用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;
}
推荐阅读
- python - Bluez 示例-广告间隔 linux
- javascript - 如何在 dash.js 中制作具有特定比特率的视频
- java - Java 8 嵌套 for 循环和条件
- visual-studio - DataSource 属性导致单元测试被跳过
- reactjs - React 在重定向之前使用 ajax 时抛出错误
- jquery - Boostrap 侧边栏仅切换顶部
- java - 尝试使用 Hadoop 运行 mapReduce jar 文件
- arrays - 使用 jq 在数组 Json 中选择值
- javascript - Angular 6:实时数据
- internationalization - 具有自定义输入格式的 xgettext