Kotlin中如何过滤并返回第一个id为123的HomeAddress?
问题分析与解决
你的代码无法运行的核心原因是逻辑方向和类型不匹配:
filter是用来筛选CustomerAccount实例的,要求lambda返回布尔值,但你内层用first返回的是HomeAddress类型,类型不兼容导致编译失败;- 就算编译通过,最终返回的也是符合条件的
CustomerAccount列表,而不是你需要的HomeAddress对象。
正确实现方式
根据你的需求(获取第一个id为"123"的HomeAddress),推荐两种安全的实现:
方式1:合并所有地址后找第一个匹配项
把所有客户的地址合并成一个列表,再取第一个符合条件的地址(找不到时返回null,避免抛出异常):
val targetAddress = accountList.flatMap { it.addresses } .firstOrNull { it.id == "123" }
方式2:从第一个包含目标地址的客户中提取地址
如果需要优先从第一个有匹配地址的客户里取第一个符合条件的地址:
val targetAddress = accountList.firstNotNullOfOrNull { customer -> customer.addresses.firstOrNull { it.id == "123" } }
为什么原代码不行
原代码中:
accountList.filter { ... }需要lambda返回Boolean,但你写的customerAccount.addresses.first { ... }返回的是HomeAddress,类型不匹配,直接编译报错;- 即使强行修改类型,最终得到的是
List<CustomerAccount>,不是你想要的HomeAddress。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

