按值过滤地图列表并返回地图

时间:2018-06-04 08:50:31

标签: java java-8 java-stream

如果我有一个List<Map<String, String>>对象,例如currencyList

0
   0 = "product_id" -> 145
   1 = "currency" -> USD
1
   0 = "product_id" -> 105
   1 = "currency" -> EUR
2
   0 = "product_id" -> 102
   1 = "currency" -> EUR

如何过滤currency=EUR

的位置

像...一样的东西。

List<Map<String, String>> eurCurrencyList 
             = currencyList.stream()
                           .anyMatch(map -> map.containsValue("EUR"));

但是,这不会返回boolean但会返回map,如下所示:

0
   0 = "product_id" -> 105
   1 = "currency" -> EUR
1
   0 = "product_id" -> 102
   1 = "currency" -> EUR

2 个答案:

答案 0 :(得分:4)

您需要使用filter进行过滤,并使用Collectors.toList()收集列表。

List<Map<String, String>> eurCurrencyList = currencyList.stream()
        .filter(map -> map.containsValue("EUR"))
        .collect(Collectors.toList());

修改

如果地图可以包含许多条目,则使用containsValue可能效率低下。相反,您可以按YCF_L@'s answer中提到的.filter(map -> map.containsKey(key) && map.get(key).equals(value))进行操作。

答案 1 :(得分:4)

  

如何过滤货币 = EUR

您必须像filter这样使用:

String key = "currency", value = "EUR";
List<Map<String, String>> eurCurrencyList = currencyList.stream()
        .filter(map -> map.containsKey(key) && map.get(key).equals(value))
        .collect(Collectors.toList());

注意,而不是:

map.containsValue("EUR")

你必须使用:

.filter(map -> map.containsKey(key) && map.get(key).equals(value))

您必须检查地图是否包含该键和值。