我如何在Java 8 lambda中创建此代码

Cla*_*nei 1 java lambda java-8

可以在Lambda中执行此操作:

for (final WarehouseAddress address : warehouse.getAddresses()) {
    if (!Validator.isEmpty(address.getPositions())) {
        final Set<WarehouseAddressPosition> positions = new HashSet<WarehouseAddressPosition>(
                address.getPositions());
        if (address.getPositions().size() > positions.size()) {
            throw new FieldDuplicatedException("position error");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过没有成功:

final Set<WarehouseAddressPosition> positions = warehouse.getAddresses().stream().filter(a -> !Validator.isEmpty(a.getPositions())).collect(
            Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

因为他试图收集一套WarehouseAdress而不是一套WarehouseAdressPosition.

错误:(130,156)java:不兼容类型:推理变量T具有不兼容的边界等式约束:br.com.erp.ejb.entity.sales.WarehouseAddressPosition下限:br.com.erp.ejb.entity.sales.WarehouseAddress

在Warehouse类我有:

private List<WarehouseAddress> addresses;
Run Code Online (Sandbox Code Playgroud)

在WarehouseAddress类中,我有:

private List<WarehouseAddressPosition> positions;
Run Code Online (Sandbox Code Playgroud)

说明:此代码获取位置的原始列表并将其收集在Set中,以创建没有重复值的集合并将大小与原始列表进行比较,以检查它是否重复.由于Set不接受重复值,因此在这种情况下大小将不同.

Era*_*ran 7

如果我理解正确,你想收集WarehouseAddressPosition,而不是WarehouseAddress,所以你需要:

final Set<WarehouseAddressPosition> positions = 
  warehouse.
  getAddresses().
  stream().
  filter(a -> !Validator.isEmpty(a.getPositions())).
  flatMap(a -> a.getPositions().stream()).
  collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

如果你希望当你遇到复制失败的过程WarehouseAddressPosition中同WarehouseAddress,我建议改变private List<WarehouseAddressPosition> positions成为一个集.这样,您可以在收集所有地址的位置之前找到此类重复项.

如果您有充分的理由不进行此更改,您可以在filter步骤中进行相同的重复检查(目前在原始代码中完成)(我希望我的语法正确,因为我现在无法检查它) :

final Set<WarehouseAddressPosition> positions = 
  warehouse.
  getAddresses().
  stream().
  filter(a -> if (!Validator.isEmpty(a.getPositions())) {
                final Set<WarehouseAddressPosition> positions = new HashSet<WarehouseAddressPosition>(
                  a.getPositions());
                if (a.getPositions().size() > positions.size()) {
                  throw new FieldDuplicatedException("position error");
                } else {
                  return true;
                }
              } else {
                return false;
              }).
  flatMap(a -> a.getPositions().stream()).
  collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)