1kotlin语言有具名函数参数,就是调用函数时不需要按照参数的顺序去填充参数,可以不按照参数声明顺序去调用
fun functionTest(name:String,age:Int){
println("name=${name},age=$age")
val num1=1000_000_000
val num2=100
println(num1+num2)
}
2kotlin语言的Unit返回类型可以省略,和java的区别是,void是关键字,而Unit是类 3kotlin中的反引号作用:将java中的普通名称但是在kotlin中又是关键字的函数名,加上单反引号后就可视为一个普通的名称
package com.njupt.base
fun main(){
你是谁()
}
private fun `你是谁`(){
println("我是你爹")
YinhaoTest.`in`()
}
4匿名函数
package com.njupt.base
fun main(){
val function1 :()->String
function1 ={
var name:String="你是我的小艾小苹果"
val length=name.count{
it == '我'
}
name
}
println(function1())
}
有参数的匿名函数的编写
package com.njupt.base
fun main(){
val function1 :(Int,String)->String={
num1,num2 ->
"返回的值为参数1:$num1,参数2:$num2"
}
println(function1(1,"啊啊啊"))
}
5当函数只有一个参数时,可以隐式的获取参数名为it,见方法三
package com.njupt.base
fun main(){
val function1 :(Int,String)->String={
num1,num2 ->
"返回的值为参数1:$num1,参数2:$num2"
}
println(function1(1,"啊啊啊"))
val function2 :(String,Int)->String={
name1,num2->
"$name1,$num2"
}
println(function2("哈哈",12))
val function3:(Int) -> Int={
it*it
}
println(function3(3))
}
6kotlin中匿名函数的写法
package com.njupt.base
fun main(){
val name={
a:Int,b:Int,c:Int->
val d=a*b
d*c
}
val week = { a: Int ->
when (a) {
1 -> "星期一"
2 -> "星期2"
3 -> "星期3"
4 -> "星期4"
else -> -1
}
}
println(week(-1))
println(name(2,2,2))
}
7函数作为另一个函数的参数的使用 7.1java的写法
package com.njupt.base;
interface ResultJson{
void code(String mess,int code);
}
public class YinhaoTest {
public static void main(String[] args) {
login("123", "123", new ResultJson() {
@Override
public void code(String mess, int code) {
System.out.println("信息是:"+mess+":状态码是:"+code);
}
});
}
public static void login(String name,String psw,ResultJson resultJson){
if(name.equals("abc")&&psw.equals("123")){
resultJson.code("登录成功",200);
}else{
resultJson.code("登录失败",444);
}
}
}
7.2.使用kotlin的写法,可以省略接口的写法。
package com.njupt.base
fun main() {
login("abc","123"){
mess:String,code:Int->
println("信息是:$mess,状态码是:$code")
}
}
fun login(name:String,pwd:String,responseCode:(String,Int)->Unit){
if(name=="abc"&&pwd=="123"){
responseCode("登录成功",200)
}else{
responseCode("登录失败",444)
}
}
内联函数的引入:在当函数作为另一个函数的参数时,从字节码的角度看就是要创建对象去调用作为参数的方法,但是引入内敛函数后可以避免创建对象相互调用带来的消耗
情况1,不引入内敛函数上面代码反编译的情况:
package com.njupt.base;
import kotlin.Metadata;
import kotlin.jvm.functions.Function2;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(
mv = {1, 1, 18},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\u001c\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\u0010\b\n\u0002\b\u0002\u001a0\u0010\u0000\u001a\u00020\u00012\u0006\u0010\u0002\u001a\u00020\u00032\u0006\u0010\u0004\u001a\u00020\u00032\u0018\u0010\u0005\u001a\u0014\u0012\u0004\u0012\u00020\u0003\u0012\u0004\u0012\u00020\u0007\u0012\u0004\u0012\u00020\u00010\u0006\u001a\u0006\u0010\b\u001a\u00020\u0001¨\u0006\t"},
d2 = {"login", "", "name", "", "pwd", "responseCode", "Lkotlin/Function2;", "", "main", "kotlin_base"}
)
public final class SoutTest2Kt {
public static final void main() {
login("abc", "123", (Function2)null.INSTANCE);
}
public static void main(String[] var0) {
main();
}
public static final void login(@NotNull String name, @NotNull String pwd, @NotNull Function2 responseCode) {
Intrinsics.checkParameterIsNotNull(name, "name");
Intrinsics.checkParameterIsNotNull(pwd, "pwd");
Intrinsics.checkParameterIsNotNull(responseCode, "responseCode");
if (Intrinsics.areEqual(name, "abc") && Intrinsics.areEqual(pwd, "123")) {
responseCode.invoke("登录成功", 200);
} else {
responseCode.invoke("登录失败", 444);
}
}
}
情况2引入内联函数的情况
package com.njupt.base;
import kotlin.Metadata;
import kotlin.jvm.functions.Function2;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(
mv = {1, 1, 18},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\u001c\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\u0010\b\n\u0002\b\u0002\u001a3\u0010\u0000\u001a\u00020\u00012\u0006\u0010\u0002\u001a\u00020\u00032\u0006\u0010\u0004\u001a\u00020\u00032\u0018\u0010\u0005\u001a\u0014\u0012\u0004\u0012\u00020\u0003\u0012\u0004\u0012\u00020\u0007\u0012\u0004\u0012\u00020\u00010\u0006H\u0086\b\u001a\u0006\u0010\b\u001a\u00020\u0001¨\u0006\t"},
d2 = {"login", "", "name", "", "pwd", "responseCode", "Lkotlin/Function2;", "", "main", "kotlin_base"}
)
public final class SoutTest2Kt {
public static final void main() {
String name$iv = "abc";
String pwd$iv = "123";
int $i$f$login = false;
short code;
String mess;
boolean var5;
String var6;
boolean var7;
if (Intrinsics.areEqual(name$iv, "abc") && Intrinsics.areEqual(pwd$iv, "123")) {
code = 200;
mess = "登录成功";
var5 = false;
var6 = "信息是:" + mess + ",状态码是:" + code;
var7 = false;
System.out.println(var6);
} else {
code = 444;
mess = "登录失败";
var5 = false;
var6 = "信息是:" + mess + ",状态码是:" + code;
var7 = false;
System.out.println(var6);
}
}
public static void main(String[] var0) {
main();
}
public static final void login(@NotNull String name, @NotNull String pwd, @NotNull Function2 responseCode) {
int $i$f$login = 0;
Intrinsics.checkParameterIsNotNull(name, "name");
Intrinsics.checkParameterIsNotNull(pwd, "pwd");
Intrinsics.checkParameterIsNotNull(responseCode, "responseCode");
if (Intrinsics.areEqual(name, "abc") && Intrinsics.areEqual(pwd, "123")) {
responseCode.invoke("登录成功", 200);
} else {
responseCode.invoke("登录失败", 444);
}
}
}
|