我有一张 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 回答
您可以简化过滤器:
如果您可以将
blueParts
更改为HashSet
而不是List
,则代码运行速度会更快,因为blueParts.contains()
需要恒定时间而不是线性时间 .基于你的问题:“我想迭代 Map 并收集所有至少有一个蓝色部分的列车 . ”我认为你正在寻找在蓝色部分列表中至少有一个元素的列车,下面是你可以做的事情 .
List<Train> trainList = trainMap.values().stream().filter(t -> t.getBlueParts().size()>0).collect(Collectors.toList());