【发布时间】:2016-08-11 03:16:11
【问题描述】:
我有一个映射列表,其中包含映射到字符串值的某些键。
类似List<Map<String,String>> aMapList;
目标:流过此地图列表并收集所有地图中单个键的值。
我是怎么做的 ->
key = "somekey";
aMapList.stream().map(a -> a.get(key)).collect(Collectors.averagingInt());
问题: 如果没有这样的密钥,我会得到异常由于 a.get(key)!因为平均这将给出一个空值。如何检查或使 lambda 忽略任何此类映射并继续前进。
我知道我可以在a -> a.contains(key) 上添加一个过滤器,然后继续。
编辑:我还可以添加更多过滤器或在一个过滤器上简单地检查多个条件。
可能的解决方案:
aMapList.stream().filter(a -> a.contains(key)).
map(a -> a.get(key)).collect(Collectors.averagingInt());
这可以变得更漂亮吗? 不要停止操作,而是跳过它们? 是否有一些更通用的方法可以跳过异常或空值。 例如。我们可以扩展 lambda 并放置一个 try-catch 块,但我仍然需要返回一些东西,如果我想做相当于“继续”的操作。
例如。
(a -> {return a.get(key) }).
可以扩展为-->
(a -> {try{return a.get(key)}
catch(Exception e){return null} }).
上面仍然返回一个null,而不是只是跳过。
我选择了给出两个选项的最佳答案,但我没有发现其中任何一个更漂亮。链接过滤器似乎是解决此问题的方法。
【问题讨论】:
-
为什么会出现异常?你不应该得到null吗?
-
我知道一种解决方案。我只是问我是否可以用更短的方式做到这一点。太多的过滤器看起来很难看,让人困惑。
-
@cricket_007,因为以后的操作会抛出异常。我会得到 null,但稍后它会中断并抛出异常。
-
然后您需要在某个时候过滤空值或在地图中忽略它们。基本上,似乎没有比你所拥有的“更简单”的方法了
-
根据@DannyChen 的说法,
contains(key)返回 true 并不能保证get(key)将返回非空值。对于某些Map实现,您可以输入空值。
标签: java lambda java-stream