Java 通过匹配谓词集合中的属性来查找特定于Android的对象
我有一个10000个对象的集合,它们有两个属性:一个字符串和一个字符串[] 每个对象大约有64个字节,所以我们在整个集合的内存中查找不到1兆字节的数据,Android在内存中搜索似乎是可以管理的 我希望与单个字符串或数组中的任何字符串完全匹配,然后返回对象的name属性 然而,android对Lambdas和.stream有一些限制,排除了许多流行的搜索解决方案,而不强制用户使用OS 7.0或更高版本,这排除了大约三分之一的用户。我想避免这样 目前,下面的代码正在运行,但考虑到我看到的一些利用streams和lambdas的选项,这似乎很糟糕Java 通过匹配谓词集合中的属性来查找特定于Android的对象,java,android,performance,kotlin,Java,Android,Performance,Kotlin,我有一个10000个对象的集合,它们有两个属性:一个字符串和一个字符串[] 每个对象大约有64个字节,所以我们在整个集合的内存中查找不到1兆字节的数据,Android在内存中搜索似乎是可以管理的 我希望与单个字符串或数组中的任何字符串完全匹配,然后返回对象的name属性 然而,android对Lambdas和.stream有一些限制,排除了许多流行的搜索解决方案,而不强制用户使用OS 7.0或更高版本,这排除了大约三分之一的用户。我想避免这样 目前,下面的代码正在运行,但考虑到我看到的一些利用s
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流,因为它不使用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参考:
集合扩展函数
数组扩展函数
字符串扩展函数
科特林
科特林
这段代码到底有什么可怕之处?除了格式化和一个catch-all-try块。除了去掉不必要的try-catch之外,我在代码中唯一要改进的是使用equalsIgnoreCase来去掉那些生成不必要垃圾的toLowerCase调用。你想用stream和lambda来实现吗?你用kotlin标记了它,所以。。。为什么不在Kotlin中做呢?有趣的isProductOrAliaslt:String=products.find{it.name.toLowerCase==lt | | | it.alias.any{it.toLowerCase==lt}}?.name?:应该是Kotlin,可以在任何api级别上工作。很好,我没有意识到Kotlin会有Java没有的功能。你认为这是最快的解决方案吗?我过去在平面数据结构中使用过散列集合,如果没有必要,我只想避免遍历每一项。“我不太了解科特林,不知道这是不是真的。”韦斯利:你在另一个SO问题中问了这个问题,我已经回答了:
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 ""
}