java - 我如何在 Java 8 lambda 中制作这段代码

标签 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");
        }
    }
}

我试过了没有成功:

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

因为他试图收集一组 WarehouseAdress 而不是一组 WarehouseAdressPosition。

Error:(130, 156) java: incompatible types: inference variable T has incompatible bounds equality constraints: br.com.erp.ejb.entity.sales.WarehouseAddressPosition lower bounds: br.com.erp.ejb.entity.sales.WarehouseAddress

在 Warehouse 类中我有:

private List<WarehouseAddress> addresses;

在 WarehouseAddress 类中我有:

private List<WarehouseAddressPosition> positions;

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

最佳答案

如果我没理解错的话,你要 Collection WarehouseAddressPosition , 不是 WarehouseAddress ,所以你需要:

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

如果您希望在遇到重复 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());

关于java - 我如何在 Java 8 lambda 中制作这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23836988/

相关文章:

Java 8 根据偶数求和或减去

java - 实现接口(interface)比较器

java - TIntProcedure 无法解析

c# - 查找两个字符串列表之间的差异

c++ - 休眠生成的线程

java - JSON 库返回 Java8 选项?

java - 您可以注入(inject)自定义异常(或其提供者)吗?

java - 如何使用Spring管理与多个数据库的连接

c# - Lambda 表达式和可空类型

Java 8 收集对象中已经存在的列表