Java8 Stream 处理两个 List,根据属性匹配进行减法运算
本文介绍了使用 Java8 Stream 处理两个 List:List<OdsMaterialDocumentItem> splitReleaseTotalMap 和 List<OdsMaterialbomItem> shoudReleaseList,并生成新的 List<OdsMaterialDocumentItem> result 的方法。
splitReleaseTotalMap 包含属性 Material 和 QuantityInEntryUnit,shoudReleaseList 包含属性 BillOfMaterialComponent 和 BillOfMaterialItemQuantity。
算法步骤如下:
-
遍历
splitReleaseTotalMap中的每个元素,并创建一个新的OdsMaterialDocumentItem对象newItem。 -
将
newItem的Material属性设置为当前元素的Material属性。 -
将
newItem的QuantityInEntryUnit属性设置为当前元素的QuantityInEntryUnit属性。 -
使用 Stream 筛选
shoudReleaseList中BillOfMaterialComponent与newItem的Material属性相等的元素,并获取第一个匹配的元素。 -
如果找到了匹配的元素,则将
newItem的QuantityInEntryUnit属性减去该元素的BillOfMaterialItemQuantity属性。 -
如果没有找到匹配的元素,则将
newItem的QuantityInEntryUnit属性减去 0。 -
将
newItem添加到result列表中。 -
遍历
shoudReleaseList中的每个元素,并检查splitReleaseTotalMap中是否存在Material与该元素的BillOfMaterialComponent属性相等的元素。 -
如果不存在,则创建一个新的
OdsMaterialDocumentItem对象newItem。 -
将
newItem的Material属性设置为该元素的BillOfMaterialComponent属性。 -
将
newItem的QuantityInEntryUnit属性设置为 0 减去该元素的BillOfMaterialItemQuantity属性。 -
将
newItem添加到result列表中。
以下代码示例展示了如何使用 Java8 Stream 实现上述算法:
List<OdsMaterialDocumentItem> result = splitReleaseTotalMap.stream()
.map(item -> {
OdsMaterialDocumentItem newItem = new OdsMaterialDocumentItem();
newItem.setMaterial(item.getMaterial());
newItem.setQuantityInEntryUnit(item.getQuantityInEntryUnit());
Optional<OdsMaterialbomItem> bomItem = shoudReleaseList.stream()
.filter(bom -> bom.getBillOfMaterialComponent().equals(item.getMaterial()))
.findFirst();
if (bomItem.isPresent()) {
newItem.setQuantityInEntryUnit(newItem.getQuantityInEntryUnit() - bomItem.get().getBillOfMaterialItemQuantity());
} else {
newItem.setQuantityInEntryUnit(newItem.getQuantityInEntryUnit() - 0);
}
return newItem;
})
.collect(Collectors.toList());
shoudReleaseList.stream()
.filter(bom -> splitReleaseTotalMap.stream().noneMatch(item -> item.getMaterial().equals(bom.getBillOfMaterialComponent())))
.forEach(bom -> {
OdsMaterialDocumentItem newItem = new OdsMaterialDocumentItem();
newItem.setMaterial(bom.getBillOfMaterialComponent());
newItem.setQuantityInEntryUnit(0 - bom.getBillOfMaterialItemQuantity());
result.add(newItem);
});
该代码使用 Java8 Stream 的 map、filter、findFirst、noneMatch、forEach 等方法对两个 List 进行操作,并生成新的 List
原文地址: https://www.cveoy.top/t/topic/oDQ9 著作权归作者所有。请勿转载和采集!