初始化接口数组时转换为lambda

时间:2018-10-05 18:46:56

标签: android lambda kotlin

我想为编辑文本视图设置过滤器。

view.findViewById<EditText>(R.id.some_edit_text).filters = arrayOf(object : InputFilter {
        override fun filter(source: CharSequence?,
                            start: Int,
                            end: Int,
                            dest: Spanned?,
                            dstart: Int,
                            dend: Int): CharSequence {
            // TODO: Do something
            return "";
        }
    })

无论如何,Android Studio会向我显示以下对象的警告/建议:InputFilter。

Convert to Lambda
This inspection reports an anonymous object literal implementing a Java interface with a single abstract method that can be converted into a call with a lambda expression.

例如,我知道如何使用lambda表达式来设置点击侦听器,但是如何为单个元素数组提供带有lambda表达式的接口呢?

1 个答案:

答案 0 :(得分:4)

单方法对象实际上不需要显式声明方法的名称,因为只有一个。通常,如果您的接口具有单一方法,则可以进行转换,即:

object : SomeInterface {
    override fun someMethod(){
        TODO("Something");
    }
}

简单一点:

SomeInterface { 
    TODO("Something");
}

如果有参数,则添加以下内容:

SomeInterface { x, y, z ->

}

,但是由于bug,这对于Kotlin中定义的接口来说是不可能的。如果您在Kotlin中尝试使用此接口,它将无法编译。

您的接口是用Java定义的,这意味着您可以执行以下操作:

view.findViewById<EditText>(R.id.some_edit_text).filters = arrayOf(InputFilter { source, start, end, dest, dstart, dend ->
    // TODO: Do something
    "";
})

此外,只要您在IntelliJ或Android Studio中获得任何建议,带有默认键绑定的 Alt + Enter 都会为您提供解决方案的建议。

enter image description here

单击Enter将自动进行转换,如果单击向右箭头,则会获得更多选项(包括修复文件中的所有相关问题,取消显示)。这也适用于错误(尽管并非所有人都可以自动修复),警告和其他建议。