我不得不使用字符串Map
来过滤Set
值,我可以使它起作用(合作伙伴建议使用anyMatch()
代替我在这里所做的事情,但我不知道如何做)而且我想知道您如何看待该算法,以及是否有可能对其进行改进(可能使用另一个Stream
函数甚至是contains()
方法),所以我不确定是否可以避免直接通过Set
(用于每个循环)。
Set<String> productIds = (some code to collect the strings) ...;
serviceResponse.setProducts(serviceResponse.getProducts().entrySet().stream()
.filter(product -> {
for (String productId: productIds) {
if (product.getKey().startsWith(productId)) {
return true;
}
}
return false;
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
重要注意事项:我正在使用Set
过滤Map
中的乘积,Set
中的字符串与Map
的键几乎具有相同的格式,因此可以安全地使用startsWith()
进行比较。
您可以通过在集合中流式传输并使用anyMatch
来避免内部for循环:
serviceResponse.setProducts(serviceResponse.getProducts()
.entrySet().stream()
.filter(product -> productIds.stream().anyMatch(product.getKey()::startsWith))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));