kotlin基础语法(学习笔记一)

一、基础语法

  1. 不一样的类型声明:

     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 "

总结:

  1. 类型推导 不是万能的,在使用函数体代码块时必须显示声明函数体返回类型,一些复杂情况如递归也不能省略返回类型。省略的时候还要考虑代码的可读性。不要一时爽维护万年坑!

  2. 声明变量  推荐使用val和不可变对象来减少代码的副作用,

  3. 函数声明  在kotlin中,一个普通的函数可分为代码块体和表达式体,前者类似于java中定义函数的习惯,后者是个表达式所以可以省略return关键字。

  4. 高阶函数  可以作为参数传递或者作为返回值。

  5. Lambda表达式  一种匿名函数

  6. 表达式和流程控制  表达式简洁、安全、便于组合

    喜欢 就关注吧,欢迎投稿!

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章