首页 文章

Java流 - 验证列表中至少有一个元素包含在另一个元素中

提问于
浏览
2

我有一张 Map . 比方说吧

Map<Long, Train>

每列火车都有一份清单

List<Integer> parts = train.getTrainParts()

我有另一个清单

List<Integer> blueParts;

我想迭代 Map 并收集所有至少有一个蓝色部分的列车 .

这是 Stream 的天真用法:

trainMap().values().stream().filter(part -> {
     boolean found = false;
     for (Long part : train.getTrainParts()) {
         if (blueParts.conatins(part)) {
              found = true;
         }
     }
     return found;
).collect(Collectors.toList());

有什么更好的选择?流还是不流?

例如

tagDataContainer.getDeliveryGroupMap().values().stream().filter(dg -> {
                Sets.SetView<Long> intersection = Sets.intersection(Sets.newHashSet(dg.getPlacements()), Sets.newHashSet(placementsToChangeStatusToPublish));
                return intersection.size()>0;
       }
 );

2 回答

  • 0

    您可以简化过滤器:

    List<Train> = 
        trainMap().values()
                  .stream()
                  .filter(t-> t.getTrainParts().stream().anyMatch(p->blueParts.contains(p)))
                  .collect(Collectors.toList());
    

    如果您可以将 blueParts 更改为 HashSet 而不是 List ,则代码运行速度会更快,因为 blueParts.contains() 需要恒定时间而不是线性时间 .

  • 5

    基于你的问题:“我想迭代 Map 并收集所有至少有一个蓝色部分的列车 . ”我认为你正在寻找在蓝色部分列表中至少有一个元素的列车,下面是你可以做的事情 .

    List<Train> trainList = trainMap.values().stream().filter(t -> t.getBlueParts().size()>0).collect(Collectors.toList());

相关问题