如何在地图列表中查找值?

时间:2019-07-03 15:25:46

标签: java java-8 java-stream

我有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);

给出110,它将返回100

2 个答案:

答案 0 :(得分:2)

假设您要查看列表中的每个Map并检查嵌套Map中的两个键,则可以执行以下操作-

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();
}

使用流来迭代包含具有必需值的映射的列表和过滤器元素,并返回匹配条件的第一个元素。

对于聚合,您可以通过添加以0开头的标识来代替findFirst()。

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);

答案 1 :(得分:0)

使用@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的{​​{1}}功能来提供替代答案。

您还可以在方法签名中指定一个默认值,以在key(s)不存在时返回。