我有一个包含 10,000 个对象的集合,这些对象具有两个属性:string
和 string[]
class Product
{
String name;
String[] aliases;
}
每个对象大约为 64 字节,因此我们正在寻找整个集合的内存不足一兆字节,这对于 Android 在内存中搜索似乎是可以管理的。
我想要与单个字符串或数组中的任何字符串精确匹配,然后返回对象的 name
属性。
但是,Android 对 Lambda 和 .stream()
有一些限制,排除了许多流行的搜索解决方案,但不强制用户使用操作系统 7.0 或更高版本,这排除了大约三分之一的用户。我想避免这种情况。
目前,以下代码正在运行,但考虑到我看到的一些利用流和 lambda 的选项,这似乎很糟糕。
public String isProductOrAlias(String lowertext) {
//products is instantiated in the parent class
//as a List<Product> loaded into memory from a local file
try {
for (Product p: products) {
if(lowertext.equals(p.name.toLowerCase()))
return p.name;
if(p.aliases != null) {
for (String s: p.aliases) {
if(lowertext.equals(s.toLowerCase()))
return p.name;
}
}
}
} catch (Exception ex) {
return "";
}
return "";
}
考虑到环境的限制,实现相同目标的最佳方法是什么?理想情况下,我们希望将 minSDK 保持在 23 (6.0) 及以上。
最佳答案
Canonical Kotlin 可以在任何版本的 Android 上运行,无论 Java Streams 是什么,因为它不使用它们:
data class Product(val name: String, val aliases: Array<String>)
// written as an extension function, but doesn't have to be...
fun List<Product>.isProductOrAlias(text: String): String {
return this.firstOrNull { product ->
product.name.equals(text, ignoreCase = true) ||
product.aliases.any { alias ->
alias.equals(text, ignoreCase = true)
}
}?.name ?: ""
}
fun test() {
// assume somewhere this was created
val products = listOf<Product>(...)
println(products.isProductOrAlias("something")) // prints name of Product or ""
}
请参阅标准库的 Kotlin API 引用:
集合扩展函数
firstOrNull()
数组扩展函数
any()
字符串扩展函数
equals()
Kotlin Elvis operator
?:
Kotlin Safecalls
?.
关于java - Android 特定的通过在谓词上匹配集合中的属性来查找对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52563862/