【发布时间】:2025-12-27 08:35:16
【问题描述】:
我有两个对象列表,其内容如下所示:
List A
id = 1, name = "alex", height = null, weight = 60
id = 2, name = "sara", height = null, weight = 50
List B
id = 1, name = "alex", height = 40, weight = null
id = 2, name = "sara", height = 30, weight = null
我想不出任何好的方法来“合并”这两个覆盖空值的列表。理想的最终结果是:
id = 1, name = "alex", height = 40, weight = 60
id = 2, name = "sara", height = 30, weight = 50
我一直在研究 Kotlin 集合,看看是否有任何东西可以帮助我更接近这一点,但我只能做到这一点:
a.union(b).groupBy { it.id }
这会返回一个以 ID 为键、以完整对象为值的地图……但我仍然需要将这些值合并到一个对象中。
有没有什么不是非常手动的方法来检查空值并在另一个列表中选择值?
【问题讨论】:
-
如果列表 1 中有 id=2、name=sarah、height=50,而列表 2 中有 id=2、name=alex、height=70 怎么办?你想同时保留它们吗?
-
集合框架通常不会合并它们的元素,而只是保留其中一个。您需要自己进行合并,例如使用 Java 流(或 Kotlin 提供的任何东西)。
-
是的,使用 Java 流 api
-
yourList.stream().collect(Collectors.toMap(e -> e.getId(), e -> e, (a, b) -> merge(a, b))之类的东西应该可以解决问题。merge(a, b)将获得两个元素并返回一个合并版本 - 您将实现该方法并通过覆盖空值并以您需要/想要的任何方式处理冲突来合并。然后将地图的values()集合转换回列表。 -
@coconut 我的回答(在下面)对你有用吗?
标签: java list kotlin collections