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

使用JavaStream API以声明方式重写创建和填充Map的命令式代码

谷星文
2023-03-14

我有这段代码:

Map<String, BillingAccount> billingAccountsMap = new HashMap<>();
for (BillingAccount ba : billingAccounts) {
    if (ba.getBillingAccountIdentifier() != null && ba.getBillingAccountIdentifier().getIdentifier() != null) {
        billingAccountsMap.put(ba.getBillingAccountIdentifier().getIdentifier(), ba);
    }
}

我只想用Java流API和collect(Collectors.toMap())以功能性的方式重写它,但我对null的情况有点困惑。

我正在使用Java 11。

共有3个答案

浦思源
2023-03-14

您可以使用filter()操作过滤掉可为空的值,然后通过传递内置收集器应用收集。将()映射到其中:

Map<String, BillingAccount> billingAccountsById = billingAccounts.stream()
    .filter(account -> Objects.nonNull(account.getBillingAccountIdentifier()))
    .filter(account -> Objects.nonNull(account.getBillingAccountIdentifier().getIdentifier()))
    .collect(Collectors.toMap(
        account -> account.getBillingAccountIdentifier().getIdentifier(), // keyMapper
        Function.identity())); // valueMapper

请注意,对于这种方法,每个标识符都必须是唯一的。否则,您需要提供mergeFunction作为第三个参数来解析映射到同一键的值。

容寒
2023-03-14
Map<String, BillingAccount> billingAccountsMap = billingAccounts.stream()
        .filter(ba -> ba.getBillingAccountIdentifier() != null
                && ba.getBillingAccountIdentifier().getIdentifier() != null)
        .collect(Collectors.toMap(ba -> ba.getBillingAccountIdentifier().getIdentifier(), ba -> ba));
孙星鹏
2023-03-14

使用Collectors.toMap(...)将项目流转换为map,使用filter()删除您不想要的项目。在您的情况下:

var billingAccountsMap = billingAccounts.stream()
        .filter(ba -> ba.getBillingAccountIdentifier() != null)
        .filter(ba -> ba.getBillingAccountIdentifier().getIdentifier() != null)
        .collect(Collectors.toMap(ba -> ba.getBillingAccountIdentifier().getIdentifier(), ba -> ba));

有关更多信息,请参阅此答案。

 类似资料:
  • 我有格式的http查询参数列表和(javax/ws/rs/client/webtarget.java)。然后,我使用命令式方法将这些查询参数逐一附加到。

  • 我试图在声明性和命令式配置的混合中设置(J)缓存,因为JCache标准没有提供限制缓存可以占用的最大大小的方法。我想尽可能地“独立于提供者”,这样我将来就可以灵活地更改提供者。目前我有使用Java7的限制,所以我相信咖啡因被丢弃了。 我在应用程序中保留了缓存列表和它们条目的持续时间(TTL)。yaml,这是我用属性加载器得到的。然后,我用以下代码创建缓存: 无论我在POM中使用哪个JCache提供

  • 问题内容: 最近,我一直在研究有关Facebook JavaScript库React.js的功能和使用方法。当其差异说话的JavaScript的世界往往是两种编程风格的休息和被mentionned。 两者有什么区别? 问题答案: 声明式的样式(如react所具有的样式)允许您通过说“它看起来像这样”来控制应用程序中的流程和状态。命令式风格可以解决这个问题,并允许您通过说“这是您应该做的”来控制应用

  • 问题内容: 我正在尝试使用普通的JS或Jquery自动提交对Steemit帖子的回复。 我使用了以下JavaScript代码,但该按钮保持禁用状态,因此不允许发布回复/评论。 如何模拟文本区域上的keydown / keypress / keyup事件,以模拟用户“经典”交互以发送回复? 谢谢 目标示例:https://steemit.com/usa/@gaottantacinque/happy-

  • 如何以编程方式从java代码填充旋转器? 我在布局中有一个旋转器,如下所示:

  • 在gdb中,你不用必须输入完整的命令,只需命令的(前)几个字母即可。规则是,只要这个缩写不会和其它命令有歧义(注,是否有歧义,这个规则从文档上看不出,看起来需要查看gdb的源代码,或者在实际使用中进行总结)。也可以使用tab键进行命令补全。 其中许多常用命令只使用第一个字母就可以,比如: b -> break c -> continue d -> delete f -> frame i -> in