マルコ・マルケッティ:
私は、フィルタを持っていたMap
使用して、値Set
の文字列のを、私はそれは(パートナーが使用することを提案し動作させることができanyMatch()
、私はここでやっているの代わりに、私はどのように見ることができない)と私はあなたがこれを思い何を知りたいと思いましたアルゴリズムと、多分、他の使用して、それを向上させることが可能であるかのStream
機能、あるいはcontains()
私はを通じて直接反復を避けることができるかどうかわからないんだけど、また、この方法をSet
(各ループのため)。
ProductsResponse serviceResponse = (obtained from backend) ...;
Set<String> productIds = (some code to collect the strings from another API) ...;
//Here starts the filtering process
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()
アップデート1:関与のクラス定義を追加。
class ProductsResponse() {
private Map<String, ProductResource> products;
}
class ProductResource () {
private String productId;
private String name;
private Double price;
}
アンドロニカス:
あなたはセットを通してストリーミングおよび使用することにより、内側forループを回避することができますanyMatch
:
serviceResponse.setProducts(serviceResponse.getProducts()
.entrySet().stream()
.filter(product -> productIds.stream().anyMatch(productId -> product.getKey().startsWith(productId)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
あなたはまた、簡潔にするための方法の参照を使用することができます。
serviceResponse.setProducts(serviceResponse.getProducts()
.entrySet().stream()
.filter(product -> productIds.stream().anyMatch(product.getKey()::startsWith))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));