如何在Java8Lambda中生成此代码

如何在Java8Lambda中生成此代码,java,lambda,java-8,Java,Lambda,Java 8,可以在Lambda中执行此操作: for (final WarehouseAddress address : warehouse.getAddresses()) { if (!Validator.isEmpty(address.getPositions())) { final Set<WarehouseAddressPosition> positions = new HashSet<WarehouseAddressPosition>(

可以在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");
        }
    }
}
for(最终仓库地址:warehouse.getAddresses()){
如果(!Validator.isEmpty(address.getPositions())){
最终集位置=新哈希集(
address.getPositions());
if(address.getPositions().size()>positions.size()){
抛出新的FieldDuplicateException(“位置错误”);
}
}
}
我试过了,但没有成功:

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

因为他试图收集一套仓库地址而不是一套仓库地址

错误:(130156)java:不兼容的类型:推断变量T有 不相容边界 相等约束:br.com.erp.ejb.entity.sales.WarehouseAddressPosition 下限:br.com.erp.ejb.entity.sales.WarehouseAddress

在仓库类中,我有:

private List<WarehouseAddress> addresses;
private List<WarehouseAddressPosition> positions;
私有列表地址;
在WarehouseAddress类中,我有:

private List<WarehouseAddress> addresses;
private List<WarehouseAddressPosition> positions;
私人列表位置;
说明:
这段代码获取原始位置列表并将其收集到一个集合中,以创建一个没有重复值的集合,并将大小与原始列表进行比较,以检查它是否重复。因为Set不接受重复的值,所以在这种情况下大小会有所不同

如果我理解正确,您希望收集
仓库地址位置
,而不是
仓库地址
,因此您需要:

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

如果我理解正确,您希望收集
仓库地址位置
,而不是
仓库地址
,因此您需要:

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

你收到的错误信息是什么?“因为他试图收集一个集合而不是一个集合。”无论我重读多少次,都没有意义。对不起,现在更正了文本。你收到的错误信息是什么?“因为他试图收集一个集合而不是一个集合。”无论我重读多少次,抱歉,现在更正了文本。不起作用给出:错误:(136156)java:不兼容类型:无法推断类型变量R(参数不匹配;lambda表达式java.util.List中的错误返回类型无法转换为java.util.stream。Stream@Claudinei很抱歉,我忘了将位置列表转换为流。请立即尝试。已成功,非常感谢。但还有另一个细节。我需要比较循环中两个集合的大小,就像我在“如果”中所做的那样(address.getPositions().size()>positions.size())”我原始代码的一部分。你认为Lambda有可能吗?@Claudinei我不确定我是否遵循了这个条件的目的。也许你可以解释一下你试图实现的目标。我必须承认,你没有Lambda的原始代码让我感到困惑,我的回答集中在修复你的Lambda尝试。你为什么在里面声明集合循环并在每次迭代中覆盖它?您不是在尝试收集所有WarehouseAddresses的WarehouseAddressPositions吗?是的,但在每个循环交互的原始代码中,我比较两个集合的大小,以检查列表中是否有一些重复的位置,因为Set不接受重复的值,所以此集合将被复制比原始问题小。我编辑了原始问题并提供了更多详细信息,对于解释不当的问题,我感到非常抱歉。不工作给出:错误:(136156)java:不兼容类型:无法推断类型变量R(参数不匹配;lambda表达式java.util.List中的错误返回类型无法转换为java.util.stream。Stream@Claudinei很抱歉,我忘了将位置列表转换为流。请立即尝试。已成功,非常感谢。但还有另一个细节。我需要比较循环中两个集合的大小,就像我在“如果”中所做的那样(address.getPositions().size()>positions.size())”我原始代码的一部分。你认为Lambda有可能吗?@Claudinei我不确定我是否遵循了这个条件的目的。也许你可以解释一下你试图实现的目标。我必须承认,你没有Lambda的原始代码让我感到困惑,我的回答集中在修复你的Lambda尝试。你为什么在里面声明集合循环并在每次迭代中覆盖它?您不是在尝试收集所有WarehouseAddresses的WarehouseAddressPositions吗?是的,但在每个循环交互的原始代码中,我比较两个集合的大小,以检查列表中是否有一些重复的位置,因为Set不接受重复的值,所以此集合将被复制比原来的小。我用更多的细节编辑了原来的问题,对于解释得不好的问题我感到非常抱歉。