Как посмотреть значение в списке карты? - PullRequest
0 голосов
/ 03 июля 2019

у меня List<Map<Integer, Map<Integer, Long>>>.Учитывая два ключа, как вернуть значение Long, используя потоки?

Например,

    List<Map<Integer, Map<Integer, Long>>> listOfMap = new ArrayList<>();

    Map<Integer, Map<Integer, Long>> lMap1 = new HashMap<>();
    Map<Integer, Long> map1 = new HashMap<>();
    map1.put(10, 100L);
    map1.put(20, 200L);
    lMap1.put(1, map1);
    listOfMap.add(lMap1);

    Map<Integer, Map<Integer, Long>> lMap2 = new HashMap<>();
    Map<Integer, Long> map2 = new HashMap<>();
    map2.put(30, 300L);
    map2.put(40, 400L);
    lMap2.put(2, map2);
    listOfMap.add(lMap2);

Учитывая 1 и 10, будет возвращено 100.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Предполагая, что вы хотите просмотреть каждую карту в списке и проверить оба ключа на вложенных картах, вы можете сделать что-то вроде ниже -

OptionalLong optional = listOfMap.stream().filter(x -> x.containsKey(1) && x.get(1).containsKey(10)).mapToLong(x -> x.get(1).get(10)).findFirst();
if (optional.isPresent()) {
  return optional.getAsLong();
}

Использование потока для итерации по списку и фильтрации элементов, содержащих карты с требуемыми значениями, и возврат первого элемента, соответствующего критериям.

Для агрегирования вместо findFirst () вы можете уменьшить, добавив, начиная с 0 в качестве идентификатора.

long l = listOfMap.stream().filter(x -> x.containsKey(1) && x.get(1).containsKey(10)).mapToLong(x -> x.get(1).get(10)).reduce(0L, (left, right) -> left + right);
0 голосов
/ 06 июля 2019

Используя предыдущий ответ из @DhruvilVaghela, вы можете сделать следующее:

public long getValue(int key1, int key2) {
    long val = listOfMap.stream().filter(
            x -> x.containsKey(key1) && x.get(key1).containsKey(key2)).mapToLong(
                  x -> x.get(key1).get(key2)).findFirst().orElse(Long.MAX_VALUE);

    return val;
}

Так как вам нужно что-то вернуть из метода, здесь используется функция orElse optional для предоставления альтернативного ответа в случае, если key(s) отсутствует на карте.

Вы также можете указать значение по умолчанию в сигнатуре метода для возврата в случае отсутствия keys(s).

...