如何使用流替换两个循环并保留列表中相同的元素

时间:2017-02-10 11:42:23

标签: java collections java-8 java-stream

kvlist.remainAll(shipper(based on code))

我有两个项目清单,根据我要过滤kvlist的托运人 我想执行computed() { someData: { return this.$store.states.someDataFromParaent } } 之类的操作,并希望将这些循环转换为流代码。

2 个答案:

答案 0 :(得分:5)

不理想,但你可以尝试做类似的事情:

List<KeyValueStoreModel> filtered = kvlist.stream().filter(
      kv -> shippers.stream().anyMatch(
               s -> s.getCode().equals(kv.getCode())
            )
      )
).collect(Collectors.toList());

因此,我们得到Stream个kv元素,而不是检查托运人Set中是否有任何相应的元素,最后我们将匹配的元素收集到新的List中。

答案 1 :(得分:2)

如果您想修改现有的收藏品,最好使用updated fiddle

kvList.removeIf(model -> shippers.stream().map(ShipperModel::getCode)
                                 .noneMatch(model.getCode()::equals));

这里我们传递一个条件:我们只删除那些在shippers中没有相应代码的元素。

如果您有许多托运人,您可以考虑先将他们的代码转储到中间集:

Set<Code> shipperCodes = shippers.stream().map(ShipperModel::getCode)
                                 .collect(Collectors.toSet());
kvList.removeIf(model -> !shipperCodes.contains(model.getCode()));

这样算法的成本从O(N * M)下降到O(N + M),其中N和M分别是托运人和模型的数量。