本文介绍了使用 Java8 Stream 处理两个 List:List<OdsMaterialDocumentItem> splitReleaseTotalMapList<OdsMaterialbomItem> shoudReleaseList,并生成新的 List<OdsMaterialDocumentItem> result 的方法。

splitReleaseTotalMap 包含属性 MaterialQuantityInEntryUnitshoudReleaseList 包含属性 BillOfMaterialComponentBillOfMaterialItemQuantity

算法步骤如下:

  1. 遍历 splitReleaseTotalMap 中的每个元素,并创建一个新的 OdsMaterialDocumentItem 对象 newItem

  2. newItemMaterial 属性设置为当前元素的 Material 属性。

  3. newItemQuantityInEntryUnit 属性设置为当前元素的 QuantityInEntryUnit 属性。

  4. 使用 Stream 筛选 shoudReleaseListBillOfMaterialComponentnewItemMaterial 属性相等的元素,并获取第一个匹配的元素。

  5. 如果找到了匹配的元素,则将 newItemQuantityInEntryUnit 属性减去该元素的 BillOfMaterialItemQuantity 属性。

  6. 如果没有找到匹配的元素,则将 newItemQuantityInEntryUnit 属性减去 0。

  7. newItem 添加到 result 列表中。

  8. 遍历 shoudReleaseList 中的每个元素,并检查 splitReleaseTotalMap 中是否存在 Material 与该元素的 BillOfMaterialComponent 属性相等的元素。

  9. 如果不存在,则创建一个新的 OdsMaterialDocumentItem 对象 newItem

  10. newItemMaterial 属性设置为该元素的 BillOfMaterialComponent 属性。

  11. newItemQuantityInEntryUnit 属性设置为 0 减去该元素的 BillOfMaterialItemQuantity 属性。

  12. 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 的 mapfilterfindFirstnoneMatchforEach 等方法对两个 List 进行操作,并生成新的 List 结果。

Java8 Stream 处理两个 List,根据属性匹配进行减法运算

原文地址: https://www.cveoy.top/t/topic/oDQ9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录