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

Jas*_*ulo 3 lambda android 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 "";
        }
    })
Run Code Online (Sandbox Code Playgroud)

无论如何,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.
Run Code Online (Sandbox Code Playgroud)

我知道如何使用lambda表达式例如在点击侦听器上进行设置,但是如何通过lambda表达式实现接口来提供单个元素数组?

Zoe*_*Zoe 5

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

object : SomeInterface {
    override fun someMethod(){
        TODO("Something");
    }
}
Run Code Online (Sandbox Code Playgroud)

简单一点:

SomeInterface { 
    TODO("Something");
}
Run Code Online (Sandbox Code Playgroud)

如果有参数,则添加如下所示的参数:

SomeInterface { x, y, z ->

}
Run Code Online (Sandbox Code Playgroud)

但是,由于存在错误,Kotlin中定义的接口无法实现。如果您在Kotlin中尝试使用此接口,它将无法编译。

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

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

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

在此处输入图片说明

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