我有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
。
答案 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)
不存在时返回。