Java流-验证列表中至少有一个元素包含在另一个元素中
我有一张地图。比方说Java流-验证列表中至少有一个元素包含在另一个元素中,java,java-8,java-stream,Java,Java 8,Java Stream,我有一张地图。比方说 Map<Long, Train> 有什么更好的选择? 流还是不流 e、 g tagDataContainer.getDeliveryGroupMap().values().stream().filter(dg->{ Sets.SetView intersection=Sets.intersection(Sets.newHashSet(dg.getPlacements()),Sets.newHashSet(placementsToChangeStatusToP
Map<Long, Train>
有什么更好的选择?
流还是不流
e、 g
tagDataContainer.getDeliveryGroupMap().values().stream().filter(dg->{
Sets.SetView intersection=Sets.intersection(Sets.newHashSet(dg.getPlacements()),Sets.newHashSet(placementsToChangeStatusToPublish));
返回交叉点。size()>0;
}
);
您可以简化过滤器:
List<Train> =
trainMap().values()
.stream()
.filter(t-> t.getTrainParts().stream().anyMatch(p->blueParts.contains(p)))
.collect(Collectors.toList());
列表=
trainMap().values()
.stream()
.filter(t->t.getTrainParts().stream().anyMatch(p->blueParts.contains(p)))
.collect(Collectors.toList());
如果您可以将blueParts
更改为HashSet
而不是List
,您的代码将运行得更快,因为blueParts.contains()
将需要恒定的时间而不是线性时间。基于您的问题:“我想迭代地图并收集至少有一个蓝色部分的所有列车。”我想你们正在寻找在bluepart列表中至少有一个元素的火车,下面是你们可以做的事情
List trainList=trainMap.values().stream().filter(t->t.getBlueParts().size()>0).collect(collector.toList())代码>只是想知道:“部分”是整数吗?有趣的方法;-)这是一个例子。ID指向部件。您可以使用blueParts::contains
作为谓词。如果这些代码>整数< /代码> S源于一系列连续值(如IDS通常所做的那样),那么您也可以考虑使用<代码> BITSET 而不是使用<代码> HASSETSE< /COD>。
List<Integer> blueParts;
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;
}
);
List<Train> =
trainMap().values()
.stream()
.filter(t-> t.getTrainParts().stream().anyMatch(p->blueParts.contains(p)))
.collect(Collectors.toList());