按键的特定值过滤对象的数组列表

时间:2019-05-10 11:20:08

标签: java spring-boot java-8

我有一个这样的数组列表,我想获取产品名称键“ Total”的值-Leisure 1,但不确定如何在Java spring boot中搜索或迭代对象的数组列表。 / p>

 "priceList": [
      {
        "Total": "10",
        "Stamp Duty": "10",
        "Main Policy": "0",
        "Product Name": "Leisure 1"
      },
      {
        "Total": "10",
        "Stamp Duty": "10",
        "Main Policy": "0",
        "Product Name": "Leisure 2"
      },
      {
        "Total": "10",
        "Stamp Duty": "10",
        "Main Policy": "0",
        "Product Name": "Leisure 3"
      },
      {
        "Total": "10",
        "Stamp Duty": "10",
        "Main Policy": "0",
        "Product Name": "Work 1"
      },
      {
        "Total": "10",
        "Stamp Duty": "10",
        "Main Policy": "0",
        "Product Name": "Work 2"
      }
    ]

我尝试这样做。我创建了一个函数

public static <K, V> Stream<K> keys(Map<K, V> map, V value) {
        return map
          .entrySet()
          .stream()
          .filter(entry -> value.equals(entry.getValue()))
          .map(Map.Entry::getKey);
    }

然后我尝试将数组列表转换为地图,并尝试对列表进行筛选以找到确切的对象,但无济于事

priceList.stream().map(x -> x.get("Total").toString()).filter(s -> s.get("Product Name") == planHeader).collect(Collectors.toList());

我如何能够遍历或搜索对象数组并按特定值进行过滤?

任何帮助表示赞赏

4 个答案:

答案 0 :(得分:1)

问题出在s.get("Product Name") == planHeader

您不应该将其与equals()进行比较吗?

答案 1 :(得分:1)

您可以使用equals方法比较不是==的字符串。
该方法检查字符串的实际内容,==运算符检查对对象的引用是否相同。

priceList.stream()
      .map(x -> x.get("Total").toString())
      .filter(s -> s.get("Product Name").equals(planHeader)) // here
      .collect(Collectors.toList());

答案 2 :(得分:0)

如果它是一个arrayList,则对其进行迭代,并对每个对象执行getter以获得总数。

for (Item i : priceList) { 
    system.out.println(i.getTotal());
}

答案 3 :(得分:0)

我从您的帖子中猜测,您使用的是这样的数据结构: List<Map<String, String>> priceList

您确实应该为价格使用自定义类。如果要使用列表和地图,以下几行可能会有所帮助。

        List<Map<String, String>> priceList = readPrices();
        // stream the list
        String total = priceList.stream()
                // filter for the price's Product Name
                .filter(price -> "Leisure 1".equals(price.get("Product Name")))
                // find the first one
                .findFirst()
                // extract the Total from the found price
                .map(price -> price.get("Total"))
                // return null if no matching price found
                .orElse(null);

可以使用字符串键访问地图。地图内部使用hashCodeequals。没什么可担心的。