一、基础语法
不一样的类型声明:
val a:String = " i am kotlin";
2、类型推导
val a = " i am kotlin";
那么什么时候使用显示声明呢?
如果是函数的参数 必须用显示声明
如果是一个非表达式定义的函数 除了 返回Unit,其他情况必须使用
如果是一个递归函数,必须使用
如果有一个公有方法的返回值,建议使用(更好的代码可读性)
3、var val介绍
var声明变量 val类似于java的final不可变。
4、高阶函数
定义:高阶函数就是把其他函数作为参数或者作为返回值的函数。是更高级的抽象机制,极大的增强了函数的表达能力。
函数类型:(Int)->Unit
用->链接参数和返回类型,参数必须用()括起来,返回值类型即使是空的也要显示声明为Unit;
多个参数用逗号隔开;
(param:String?)->Unit 类型后边的 ?代表次参数可以为空;
函数作为参数 ((Int)->Unit)->Unit
函数作为返回值 (Int)->(Int)->Unit
双冒号语法 :: 用来引用类的变量和方法
匿名函数就是无需定义函数名称,其他的和普通函数定义语法一样,简而言之,匿名函数就是⼀个普通函数除了其名称省略了,其函数体也可以是表达式或代码块
5、lambda
例子:val sum:(Int x,Int y)->Int={Int x,Int y->x+y}
一个lambda表达式必须用{}来包裹;
如果lambda声明了参数部分的类型,且返回值类型支持推导,那么lambda变量就可以省略函数类型声明;
val sum={Int x,Int y->x+y}
如果lambda变量声明了函数类型,那么lambda表达式参数部分的类型就可以省略。
val sum:(Int x,Int y)->Int={x,y->x+y}
单个参数的隐式名称it(语法糖),listOf(1,2).forEach{print(it)}等价于listOf(1,2).forEach{it->print(it)};
如果lambda表达式要调用某个方法fun printKot(p:Int)={print(it)},则需要在传入表达式的方法后边加()去执行本方法,()其实就是执行了Function的invoke()方法;
示例:listOf(1,2).forEach{printKot(it)()};
6、区分fun函数声明和lambda表达式
1、代码块函数体:fun在没有等号只有{}的情况下,如果返回非Unit,必须带return;
fun foo(x:Int){print(x)}
fun foo(x:Int):Int{return x+2}
2、单表达式函数体:fun带有等号,这个可以省略return;
fun foo(x:Int):Int={x+2}
fun foo(x:Int):Int=x+2
注意:不管是val还是fun,如果是等号加{}的语法,那么构建的就是lambda表达式,lambda的参数在花括号的内部声明,如果左侧是fun那么就是lambda表达式函数体,也必须通过()或者invoke调用lambda。示例:
fun foo(x:Int,y:Int):Int={x+y} 调用 foo(1,2)或foo.invoke(1,2)
fun foo(x:Int):Int={y:Int->x+y} 调用 foo(1).(2)或foo(1).invoke(2)
3、闭包
在kotlin中,由{}包裹的代码块访问了外部环境变量则该代码块被称为一个闭包,一个闭包可以直接当做参数传递或者直接使用,可以看成是访问外部环境变量的函数,lambda表达式是常见的闭包形式。
介绍一种lambda自运行的方式{x:Int->print(x)}(1);
7、函数调用说明
如果参数有多个,且最后一个为函数,则可以按照如下方式调用:
fun foo(x:Int,y:Int,res:(Int,Int)->Int)){
res(x,y)
}
调用方式:
fun foo(1,2){
x,y->{return x+y}
}
8、表达式
可以是一个值、常量、变量、操作符、函数或者他们之间的组合,通俗的讲,表达式就是可以返回值的语句。
9、枚举
与java比kotlin的枚举就是一个类 多了class符号
enum class DayOfweek (val day:Int){
MON(1),
TUS(2)
;//如果以下有额外的方法或属性定义,则必须强制加上分号
fun getDayNum:Int{
return day
}
}
10、when表达式
结构 when else 组成,由花括号包含多个逻辑分支,每个分支由->链接;
when关键字的参数可以省略(这种情况下分支->左侧需返回boolean值,否则报错);
11、for循环和范围表达式
for in step downTo util 几个关键字的用法
for(i in 1..10 step 2) print(i);
倒序:for(i in 1..10 downTo 1 step 2) print(i);
var res= “a” in "abc".."xyz"; in 、!in的用法
“a” ! in listOf("a","b","c");
12、中缀表达式
格式 A 中缀方法 B
注意:1、中缀方法必须是某个类的成员方法或者扩展函数
2、中缀方法必须只有一个参数,不可以多个,也不能是可变参数varargs
3、在方法前必须加infix关键字
class person {
infix fun call(name:String){
print("my name is ${name}}.");
}
}
调用方式
val p=Person();
p call "hello"
还可以跟普通语法一样调用 p.call("hello");
13、字符串
语法参考官网,
1、原生字符串 “”” 。。。”””
val html=""" <html>
<body> 你好</body>
""" </html>
java写法:
String html="<html>\n"+
"<body> 你好</body>\n"+
" </html>\n" ;
2、字符串模板${表达式}
"你好,${name}"
"kotlin has ${if("kotlin".length>0 "kotlin".length else "no")} letters "
总结:
类型推导不是万能的,在使用函数体代码块时必须显示声明函数体返回类型,一些复杂情况如递归也不能省略返回类型。省略的时候还要考虑代码的可读性。不要一时爽维护万年坑!
声明变量 推荐使用val和不可变对象来减少代码的副作用,
函数声明 在kotlin中,一个普通的函数可分为代码块体和表达式体,前者类似于java中定义函数的习惯,后者是个表达式所以可以省略return关键字。
高阶函数 可以作为参数传递或者作为返回值。
Lambda表达式 一种匿名函数
表达式和流程控制 表达式简洁、安全、便于组合
喜欢 就关注吧,欢迎投稿!
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/kotlin基础语法(学习笔记一)/