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

时间:2016-05-31 06:07:11

标签: java java-8 java-stream

我有一张地图。我们说

{
    "content_scripts": [
       {
         "matches": ["*://web.whatsapp.com*"],
         "js": ["content_script.js"]
       } 
    ]
}

每列火车都有一个清单

Map<Long, Train> 

我有另一个清单

List<Integer> parts = train.getTrainParts()

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

这是对List<Integer> blueParts; s:

的天真用法
Stream

有哪些更好的选择? 流或不流?

e.g。

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

2 个答案:

答案 0 :(得分:7)

您可以简化过滤器:

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

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

答案 1 :(得分:1)

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

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