gpt4 book ai didi

kotlin - 在 Kotlin 的嵌套列表中查找并返回第一个匹配项?

转载 作者:行者123 更新时间:2023-12-02 23:45:16 29 4
gpt4 key购买 nike

考虑以下两个类:

class ObjectA(val objectBs: List<ObjectB>,
val otherFields: Any)

class ObjectB(val key: String,
val otherFields: Any)

任务是在ObjectA列表中查找并返回第一个具有特定键的ObjectB。

仅仅实现目标很简单,但要做得好且高效似乎就相当棘手了。我找不到类似“firstIn”或“findIn”函数的东西,它们允许我在迭代 ObjectA 列表时返回除 ObjectA 之外的其他类型。

我有几种方法,其中一种看起来不错,但效率很低:

listOfA.mapNotNull { 
it.objectBs.firstOrNull {
item -> item.key == wantedKey
}
}.firstOrNull()

这段代码的明显低效之处在于,当它找到匹配项时,它不会停止对 listOfA 的迭代(并且只能有一个匹配项,只是为了清楚起见)。使用filter或find的方法也有类似的问题,需要通过至少一个ObjectB列表进行冗余迭代。

kotlins 标准库中是否有可以涵盖此类用例的内容?

最佳答案

如果你想要一个优雅的解决方案,你可以像这样做一个flatMap:

val result: ObjectB? = listOfA.flatMap { it.objectBs }.firstOrNull { it.key == "myKey" }

如果你想要提高效率,你可以这样做:

val result: ObjectB? = objectAs.firstOrNull {
it.objectBs.map(ObjectB::key).contains("myKey")
}?.objectBs?.firstOrNull { it.key == "myKey" }

您还可以将它们包装在 Optional 中,并将其放入函数中,以便此操作的用户可以获得干净的 API:

fun List<ObjectA>.findFirstObjectB(key: String): Optional<ObjectB> {
return Optional.ofNullable(firstOrNull {
it.objectBs.map(ObjectB::key).contains(key)
}?.objectBs?.firstOrNull { it.key == key })
}

关于kotlin - 在 Kotlin 的嵌套列表中查找并返回第一个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52740199/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com