在Kotlin中,我可以在集合上有条件构建器元素吗?



目前我有一个查询看起来像这样:

override suspend fun getExternalTestsForProfile(profileKey: String, take: Int?): List<ExternalTestEntity> {
RealmDb.useRealm {
where(RealmExternalTest::class.java)
.sort(RealmExternalTestFields.CREATED_AT, Sort.DESCENDING)
.findAll()

我想有这样的功能,如果take是null,它将获取集合中的所有元素,但如果提供了Int,它将只在这种情况下获取和映射。

所以my "desired"功能是这样的:

override suspend fun getExternalTestsForProfile(profileKey: String, take: Int?): List<ExternalTestEntity> {
RealmDb.useRealm {
where(RealmExternalTest::class.java)
.sort(RealmExternalTestFields.CREATED_AT, Sort.DESCENDING)
.findAll()
if (take != null) {
.take(3)
} else {
// Do not apply a .take
}
.map { realmExternalTest -> realmExternalTest.toExternalTestEntity() }

我希望取在映射之前发生,因为映射可能很昂贵,因为它可能有很多元素。因此,为了获取3个元素而执行昂贵的map操作是浪费的。

我考虑重载getExternalTestsForProfile,有一个有take,一个没有,但希望我能把它结合起来,因为这里唯一真正的区别是映射和返回多少元素。

感谢

我不知道Realm,但看看他们的API,它看起来像take不是你想要的。你应该在调用findAll()之前使用limit(),否则findAll()会返回所有结果。

现在对于您的实际问题,无论您坚持使用take还是使用limit,您都可以使用let来内联执行此操作:

where(RealmExternalTest::class.java)
.sort(RealmExternalTestFields.CREATED_AT, Sort.DESCENDING)
.let {
if (take != null) it.limit(take) else it
}
.findAll()

或者您可以将其提取到一个函数中以获得更好的可读性:

private fun <E> RealmQuery<E>.maybeLimit(limit: Long?): RealmQuery<E> =
if (limit != null) limit(limit) else this

相关内容

  • 没有找到相关文章

最新更新