Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
过滤val变量而不更改其声明Kotlin_Kotlin - Fatal编程技术网

过滤val变量而不更改其声明Kotlin

过滤val变量而不更改其声明Kotlin,kotlin,Kotlin,我有以下代码: selectedMedias.filter { !File(it.path).exists() } info:Filter返回另一个通过给定回调过滤的对象 问题在于selectedMedias声明为val。我不想更改声明以生成代码 selectedMedias = selectedMedias.filter { !File(it.path).exists() } 如何过滤val变量而不更改其声明 我无法重新分配selectedMedias,因为selectedMedias是适

我有以下代码:

selectedMedias.filter { !File(it.path).exists() }
info:Filter返回另一个通过给定回调过滤的对象

问题在于
selectedMedias
声明为val。我不想更改声明以生成代码

selectedMedias = selectedMedias.filter { !File(it.path).exists() }
如何过滤
val
变量而不更改其声明


我无法重新分配selectedMedias,因为selectedMedias是适配器的ArrayList,这就是我无法重新分配它的原因

如果我理解正确,您希望修改类型为
ArrayList
val
属性

由于
val
,该实例是不可变的,但您可以像往常一样修改内部值:

val selectedMedias = ArrayList<T>(/*init value*/)

selectedMedias.apply {
   val newValues = this.filter { !File(it.path).exists() }
   clear()
   addAll(newValues)
}
val selectedMedias=ArrayList(/*init value*/)
selectedMedias.apply{
val newValues=this.filter{!文件(it.path).exists()}
清除()
addAll(新值)
}

您可以使用
removeIf()适当地筛选列表(假设它是
可变列表
,例如
数组列表

请注意,谓词是反向的:它应该返回
true
以删除该项,返回
false
以保留该项。(不幸的是,似乎没有相应的
keepIf()
,因为这与
filter()
的工作方式更为相似。但如果需要,您可以轻松编写一个!)


(*如果列表是不可变的,并且不是
var
,那么当然没有办法更改它。)

是否
selectedMedias
是某个类的属性?它是适配器的ArrayList,这就是我无法重新分配它的原因,您确定必须更改
selectedMedias
内容吗?也许一个自定义的
get
方法
val-selectedMedias-get()=field.filter{…}
或者一个支持属性
val-filteredSelectedMedias-get()=selectedMedias.filter{…}
可以帮助你解决这个问题。是的,我必须改变它,你的两种解决方案似乎都是可行的。但是,这种过滤操作很少发生,因此设置get()对于访问selectedMedias的代码的其他部分来说是一种过分的杀伤力
val selectedMedias = mutableListOf(File(a), File(b))
selectedMedias.removeIf{ File(it.path).exists() }