我有一个映射到字符串值的特定键的映射列表。
类似于<代码>列表
目标:浏览此地图列表,并收集所有地图中单个键的值。
我是怎么做到的-
key = "somekey";
aMapList.stream().map(a -> a.get(key)).collect(Collectors.averagingInt());
问题是:如果没有这样的密钥,我会因为a.get(key)而出现异常!因为求平均值会得到一个空值。如何检查或使lambda忽略任何此类地图并继续前进。
我知道我可以在a上添加一个过滤器-
aMapList.stream().filter(a -> a.contains(key)).
map(a -> a.get(key)).collect(Collectors.averagingInt());
能不能把它弄得更漂亮?与其停止操作,不如跳过它们?是否有更通用的方法跳过异常或空值。例如,我们可以扩展lambda并放置一个try-catch块,但我仍然需要返回一些东西,如果我希望执行“continue”的等效操作,该怎么办。
Eg.
(a -> {return a.get(key) }).
可以扩展到--
(a -> {try{return a.get(key)}
catch(Exception e){return null} }).
上面的代码仍然返回null,而不是跳过。
我选择了最佳答案,给出了两个选项,但我没有发现其中任何一个更漂亮。链接过滤器似乎是解决这个问题的方法。
我能想到的最简单的办法是:
aMapList.stream()
.filter(map -> map.containsKey(key))
.map(map -> map.get(key))
.collect(Collectors.toList());
通过以这种方式格式化lambda,更容易看到代码处理的不同步骤。
根据地图文档和您在问题下的评论,您实际上并没有从a.get(key)
得到异常。相反,该表达式会生成一个空值,当您稍后遇到这些空值时,就会遇到问题。因此,只需立即过滤掉这些空值就可以了:
aMapList.stream()
.map(a -> a.get(key))
.filter(v -> v != null)
.collect(Collectors.toList());
这比你问题中的变通方法更漂亮、更简单、性能更好。
我应该提一下,我通常更喜欢可选
用可选
包装结果如何:
List<Optional<String>> values = aMapList.stream()
.map(a -> Optional.ofNullable(a.get(key)))
.collect(Collectors.toList());
稍后的代码将知道可能的空元素。
对于允许null
值的映射,您提出的解决方案有一个潜在的错误。例如:
Map<String, String> aMap = new HashMap<>();
aMap.put("somekey", null);
aMapList.add(aMap);
aMapList.straem()
.filter(a -> a.contains("somekey")) // true returned for contains
.map(a -> a.get("somekey")) // null returned for get
.collect(Collectors.toList());
当这起作用时,它可能会引发重复键插入(相同的lastname)的异常。怎么抓?我不能在Tomap中声明try-catch。
我认为错误并不在注释中,因为我更改了几次注释,仍然得到了相同的异常。
我有一些代码需要帮助...我正在尝试使用两个地图作为源并同时使用java lambdas构建地图 我可以用你们在上面看到的foreach做到这一点,但我试图用lambdas做到这一点。。。像这样的 我想要的输出是这样的 但我无法理解
我正在努力使用Java Spring Hibernate,我正在尝试实现Oauth2,在通过@ManyToMany将表用户连接到角色时,我不断遇到错误。我已经阅读了所有关于我的问题的答案,无论我尝试什么,我仍然得到了一个组织。冬眠映射异常。 以下是我正在努力做的事情的全部细节。 数据库结构 角色。JAVA 使用者JAVA 依赖性 问题: org.springframework.beans.fact
还在学习Java8。我的代码看起来像: 上述代码不起作用,因为peek()无法访问主流变量,即map()中使用的电子邮件。我该如何解决这个问题?
首先,我对这个问题太长表示最诚挚的歉意,但老实说,我不知道如何缩短它,因为每个部分都是一个特例。诚然,我可能对此视而不见,因为我已经把头撞到墙上好几天了,我开始绝望了。 我向所有通读这本书的人表示最大的尊重和感谢。 我希望能够通过使用Jersey ExceptionMapers将Shiro的AuthenticationException及其子类映射到JAX-RS响应,Jersey例外映射器是使用G