Фильтр массива списка объектов по определенному значению ключа - PullRequest
0 голосов
/ 10 мая 2019

У меня есть такой список массивов, и я хотел бы получить значение ключа «Итого» для названия продукта - Досуг 1, но не уверен, как искать или перебирать список объектов массива в весенней загрузке Java

 "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 ]

1 голос
/ 10 мая 2019

Вы можете использовать метод equals для сравнения строк, которые не ==.
Этот метод проверяет фактическое содержимое строки, а оператор == проверяет, является ли ссылка на объект одинаковой.

priceList.stream()
      .map(x -> x.get("Total").toString())
      .filter(s -> s.get("Product Name").equals(planHeader)) // here
      .collect(Collectors.toList());
1 голос
/ 10 мая 2019

Проблема с s.get("Product Name") == planHeader

Разве вы не должны сравнивать это с equals ()?

0 голосов
/ 10 мая 2019

Полагаю, из вашего поста вы используете такую ​​структуру данных: 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);

Это нормально, чтобы получить доступ к карте с ключом строки. Карта использует hashCode и equals внутри. Здесь не о чем беспокоиться.

0 голосов
/ 10 мая 2019

Если это arrayList, просто итерируйте по нему, и для каждого объекта выполните getter, чтобы получить сумму.

for (Item i : priceList) { 
    system.out.println(i.getTotal());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...