我有一段代码:

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 Stream API和collect(Collectors.toMap())以功能性的方式重写它,但我对null个 case 有点困惑.

我正在使用Java11.

推荐答案

您可以使用filter()操作过滤掉可为空的值,然后通过向其中传递内置收集器Collectors.toMap()来应用collect:

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作为第三个参数来解析映射到同一个键的值.

Java相关问答推荐

无法从TemporalAccessor获取Instant:{},ISO解析为2024-04- 25 T14:32:42类型为java.time. form.Parsed

无法运行Java(已解决)

如何在Spring Boot中创建500错误的响应正文?

如何在Spring Security中设置CustomLogin路径?

在Java中将Charsequence数组更改为String数组或List String<>

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

解析Javadoc时链接的全限定类名

如何使用值中包含与号的查询参数创建一个java.net.URI

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

SonarLint:只能有条件地调用方法(S)

如何在代码中将行呈现在矩形前面?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

将ByteBuffer异步写入InputStream或Channel或类似对象

垃圾回收器是否真的删除超出作用域的对象?

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

如何在SWT菜单项文本中保留@字符

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

通过/失败的参数化junit测试方法执行数

如何在Java中的重写方法参数中强制(Enum)接口实现?