当前位置: 首页 > 知识库问答 >
问题:

Java映射Lambda异常

澹台正业
2023-03-14

我有一个映射到字符串值的特定键的映射列表。

类似于<代码>列表

目标:浏览此地图列表,并收集所有地图中单个键的值。

我是怎么做到的-

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,而不是跳过。

我选择了最佳答案,给出了两个选项,但我没有发现其中任何一个更漂亮。链接过滤器似乎是解决这个问题的方法。


共有3个答案

通令
2023-03-14

我能想到的最简单的办法是:

aMapList.stream()
        .filter(map -> map.containsKey(key))
        .map(map -> map.get(key))
        .collect(Collectors.toList());

通过以这种方式格式化lambda,更容易看到代码处理的不同步骤。

充普松
2023-03-14

根据地图文档和您在问题下的评论,您实际上并没有从a.get(key)得到异常。相反,该表达式会生成一个空值,当您稍后遇到这些空值时,就会遇到问题。因此,只需立即过滤掉这些空值就可以了:

aMapList.stream()
    .map(a -> a.get(key))
    .filter(v -> v != null)
    .collect(Collectors.toList());

这比你问题中的变通方法更漂亮、更简单、性能更好。

我应该提一下,我通常更喜欢可选

梁丘远航
2023-03-14

可选包装结果如何:

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