You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中List<Contact>初始化要求传参,add、lowercase方法不识别问题

问题原因及解决方案

1. List<Contact>() 报参数缺失错误的原因

  • Kotlin 中的 List 是只读集合接口,本身无公开构造方法,你调用的 List() 实际是标准库提供的工厂函数 List(size: Int, init: (Int) -> T),要求必须传入集合长度和元素初始化逻辑两个参数,这是报错的直接原因。
  • 你之前使用的 ArrayList 是JDK提供的可变集合具体实现类,自带无参构造方法,二者定位完全不同,差异和你直接使用List<>有关。

2. add() 方法无法识别的原因

该问题同样和使用List<>有关:List 接口仅定义了读取集合的相关方法,没有add、remove这类修改集合的方法,只有MutableList(可变List接口)的实现才支持修改操作。

3. lowercase() 方法无法识别的原因

该问题和List<>无关:lowercase() 是String类的扩展方法,你直接对自定义的Contact类型对象调用该方法,自然找不到对应实现,需要先取Contact类中存储名称的字符串属性再调用小写转换方法。


修正后的代码示例

你可以直接用Kotlin内置的集合操作符简化筛选逻辑,无需手动创建集合写循环:

val contacts = remember { DataProvider.contactList }
var filteredContacts: List<Contact>
val textState = remember { mutableStateOf(TextFieldValue("")) }
LazyColumn(
    ...
) {
    // 原代码此处textVal为笔误,修正为textState
    val searchText = textState.value.text
    filteredContacts = if (searchText.isEmpty()){
        contacts
    } else {
        // 替换name为你Contact类中实际要匹配的字符串属性
        contacts.filter { contact ->
            contact.name.lowercase(Locale.getDefault())
                .contains(searchText.lowercase(Locale.getDefault()))
        }
    }

如果一定要手动写循环实现,可将else分支替换为如下代码:

else{
    val resultList = mutableListOf<Contact>()
    for (contact in contacts) {
        if (contact.name.lowercase(Locale.getDefault()).contains(searchText.lowercase(Locale.getDefault()))) {
            resultList.add(contact)
        }
    }
    resultList
}

内容的提问来源于stack exchange,提问作者Tomee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:48:04