16.2 函数式接口
标签(空格分隔): kotlin 出版
书名:Kotlin基础教程
作者:陈小默
函数式接口是Java8中新增的一个重要特性,是为了配合Lambda而提出的一个新概念。下面我们来展示一下Java中如何使用函数式接口去实现从一个字符串向整型数字的转换:
首先,定义一个接口
public interface Convertor<F, T> {
T convert(F from);
}
然后,在main方法中使用Lambda中实现并使用这个接口
public static void main(String[] args) {
Convertor<String, Integer> convertor = Integer::parseInt;
System.out.print(convertor.convert("22"));
}
看起来已经很简洁了,但是仍然远不如Kotlin。虽然这一节的名字叫做函数式接口,但是Kotlin实现这样的功能并不需要去编写一个真正接口。来,让我们先欣赏以下Kotlin的实现方式:
fun main(args: Array<String>) {
var convert = String::toInt
print(convert.invoke("22"))
}
就是如此简洁,甚至不需要指定方法名,Kotlin已经为调用匿名函数式接口提供了一个invoke方法。
符号说明
在上面几个例子中,我们主要使用了两个符号”->”,”::”,下面我们来重点介绍以下这些操作符的含义
“->”(goes to)操作符
该操作符的含义是用来分隔 参数列表 与 代码块,举个例子
fun main(args: Array<String>) {
var convert = { arg: String -> arg.toInt() }
println(convert.invoke("22"))
}
第二行大括号里符号的含义是:该匿名方法有一个参数arg,且参数类型被指定为String,操作符表示左侧的参数传递给右侧的方法体,方法调用参数的toInt方法的到并推论出匿名函数的返回值类型为Int
“::域名解析符”
顾名思义,该符号是用来指明所调用的方法的入口地址的。
比如 var convert = String::toInt 这句话的含义是定义一个匿名方法,通过推断发现这个匿名方法的返回值是Int类型,而toInt是String类型的方法,所以推断接收参数类型为String类型。所以该匿名方法的调用过程就是:当接收到一个String类型的参数是,根据域名解析符从参数上找到将要被调用的方法toInt。一次执行过程就结束了。