我有这段代码:
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。
您可以使用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
作为第三个参数来解析映射到同一键的值。
Map<String, BillingAccount> billingAccountsMap = billingAccounts.stream()
.filter(ba -> ba.getBillingAccountIdentifier() != null
&& ba.getBillingAccountIdentifier().getIdentifier() != null)
.collect(Collectors.toMap(ba -> ba.getBillingAccountIdentifier().getIdentifier(), ba -> ba));
使用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