目前我有一个查询看起来像这样:
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