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

时间:2018-09-28 23:56:48

标签: java android performance kotlin

我有10,000个对象的集合,这些对象具有两个属性:stringstring[]

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)以上。

1 个答案:

答案 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参考: