我有10,000个对象的集合,这些对象具有两个属性:string
和string[]
class Product
{
String name;
String[] aliases;
}
每个对象大约有64个字节,因此我们正在查看整个集合的内存不足1兆字节,对于Android搜索内存而言,这似乎是可管理的。
我想要与单个字符串或数组中的任何字符串完全匹配,然后返回对象的name
属性。
但是,android在Lambdas和.stream()
上有一些限制,这些限制排除了许多流行的搜索解决方案,而没有强迫用户使用OS 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)以上。
答案 0 :(得分:1)
Kontical Kotlin可以在任何版本的Android上运行,而与Java Streams无关,因为它不使用Java
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()
科特琳Safecalls ?.