Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过匹配谓词集合中的属性来查找特定于Android的对象_Java_Android_Performance_Kotlin - Fatal编程技术网

Java 通过匹配谓词集合中的属性来查找特定于Android的对象

Java 通过匹配谓词集合中的属性来查找特定于Android的对象,java,android,performance,kotlin,Java,Android,Performance,Kotlin,我有一个10000个对象的集合,它们有两个属性:一个字符串和一个字符串[] 每个对象大约有64个字节,所以我们在整个集合的内存中查找不到1兆字节的数据,Android在内存中搜索似乎是可以管理的 我希望与单个字符串或数组中的任何字符串完全匹配,然后返回对象的name属性 然而,android对Lambdas和.stream有一些限制,排除了许多流行的搜索解决方案,而不强制用户使用OS 7.0或更高版本,这排除了大约三分之一的用户。我想避免这样 目前,下面的代码正在运行,但考虑到我看到的一些利用s

我有一个10000个对象的集合,它们有两个属性:一个字符串和一个字符串[]

每个对象大约有64个字节,所以我们在整个集合的内存中查找不到1兆字节的数据,Android在内存中搜索似乎是可以管理的

我希望与单个字符串或数组中的任何字符串完全匹配,然后返回对象的name属性

然而,android对Lambdas和.stream有一些限制,排除了许多流行的搜索解决方案,而不强制用户使用OS 7.0或更高版本,这排除了大约三分之一的用户。我想避免这样

目前,下面的代码正在运行,但考虑到我看到的一些利用streams和lambdas的选项,这似乎很糟糕

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 ""
}