java - Android 特定的通过在谓词上匹配集合中的属性来查找对象

标签 java android performance kotlin

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

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 引用:

关于java - Android 特定的通过在谓词上匹配集合中的属性来查找对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52563862/

相关文章:

java - 是否存在只存储哈希码而不存储实际对象的数据结构?

performance - DNS 预取和页面优化

ios - 在 Grand Central 中跟踪线程的技术?

javascript - 查找嵌套的 <li> 并修改它

Javascript:尽管数组稀疏,但 indexOf 在高索引上还是很慢?

java - 需要对多个日志文件进行过滤、解析和排序

java - 调整序列化 DOM 中的 XML 命名空间声明样式

Java native 方法。公共(public)与私有(private)

android - SurfaceHolder.lockCanvas() 太贵了

android - 有什么方法可以识别 Android 中使用的数据类型 (2G/3G)?