在java8之前,JDK不支持lamda表达式,所以在java类里 只能使用FunctionN 来调用Kotlin的函数类型属性,N表示值参数数目, 所以共有Funcion0 到Function23()个方法,每一个FunctionN 都包含一个invoke()函数,专门用于调用函数类型函数。
kotlin类包含了很多各种各样的函数类型
@file:JvmName("Hero")
class HeroKt {
val translator0 : () -> Unit = { println("哈哈") }
val translator01 : () -> String = { "你好" }
//添加一个translator的函数类型,接收一个字符串,
//将其改为小写字母,再大写第一个字符,最后打印结果。
val translator1: (String) -> Unit = { utterance: String ->
println(utterance.toLowerCase().capitalize())
}
val translator2: (String,Int) -> Unit = { name: String,age:Int ->
println("$name, $age")
}
val translator3: (String,Int,String) -> String = { name: String,age:Int,sex:String ->
"$name, $age, $sex"
}
var translator41: ((String, Int, String, Int) -> Unit)? = null
var translator42: ((String, Int, String, Int) -> String)? =null
fun main() {
}
}
在 Java类里 Jhava调用 Kotlin 类的Hero 函数类型
public class Jhava {
public static void main(String[] args) {
//官方写法
Function0<Unit> translator0 = Hero.getTranslator0();
translator0.invoke();//哈哈
//简写
Hero.getTranslator0().invoke(); //哈哈
Function0<String> translator01 = Hero.getTranslator01();
System.out.println( translator01.invoke() ); //你好
Function1<String, Unit> translator1 = Hero.getTranslator1();
translator1.invoke("TRUCE"); //Truce
Function2<String,Integer,Unit> translator2 = Hero.getTranslator2();
translator2.invoke("方明飞",34); // 方明飞, 34
Function3<String,Integer,String,String> translator3 = Hero.getTranslator3();
System.out.println( translator3.invoke("方明飞",34,"男") ); //方明飞, 34, 男
Hero.setTranslator41(new Function4<String, Integer, String, Integer, Unit>() {
@Override
public Unit invoke(String s, Integer integer, String s2, Integer integer2) {
System.out.println(s+integer+s2+integer2); //方明飞23男160
return null;
}
});
Hero.getTranslator41().invoke("方明飞",23,"男",160);
Hero.setTranslator42(new Function4<String, Integer, String, Integer, String>() {
@Override
public String invoke(String s, Integer integer, String s2, Integer integer2) {
System.out.println(s+integer+s2+integer2); //方明飞23男170
return s+integer+s2+integer2;
}
});
Hero.getTranslator42().invoke("方明飞",23,"男",170);
}
}
在 Kotlin类Spellbook里 调用 Kotlin 类的Hero 函数类型
class Spellbook {
fun main(){
translator0.invoke() //哈哈
val str01 = translator01.invoke()
println(str01) //你好
translator1.invoke("FMF") //Fmf
translator2.invoke("方明飞",23) //方明飞, 23
val str03 = translator3.invoke("方明飞",23,"男")
println(str03) //方明飞, 23, 男
translator41={ s: String, i: Int, s1: String, i1: Int ->
println("$s $i $s1 $i1") //方明飞 23 男 160
}
translator41?.invoke("方明飞",23,"男",160)
translator42 = { s: String, i: Int, s1: String, i1: Int ->
"$s $i $s1 $i1" //方明飞 23 男 160
}
val str = translator42?.invoke("方明飞",23,"男",170)
println(str) //方明飞 23 男 170
}
}
}