どのように文字列のセットを使用してマップ値をフィルタするには?

マルコ・マルケッティ:

私は、フィルタを持っていた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)));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=31508&siteId=1