【第1篇】Kotlin基本语法详解

1、定义包

包的声明应处于源文件顶部

package com.kotlin.flong.base
import java.util.*

目录与包的结构无需匹配:源代码可以在文件系统的任意位置。

2、 定义函数

  • 1、带有两个 Int参数、返回 Int 的函数:
//计算a+b
fun sum(a: Int,b :Int) : Int{
    return a+b;
}
  • 2、将表达式作为函数体、返回值类型自动推断的函数:
//无return关键字的加法
fun sum1(a: Int,b : Int) = a + b;
  • 3、函数返回无意义的值,$是占位符进行处理
//函数返回无意义的值,`Unit`相当于void,$是占位符进行处理
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
  • 4 Unit 返回类型可以省略:$是占位符进行处理
//无Unit
fun printSum1(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}

3、 定义变量

  • 定义只读局部变量使用关键字 val定义。只能为其赋值一次
//一次赋值(只读)的局部变量:
fun test1(){
    val a: Int = 1 // 初始化值
    val b = 2 // 类型推断出 `Int` 类型
    val c: Int // 如果没有初始值类型不能省略
    c = 3 // 明确赋值
    println(c)
}

4、占位符模板

  • replace和$使用
//replace和$使用
fun replace(){
    var a = "中国人"
    val s1 = "我是 $a" //占位符模板
    println(s1);
    
    //将是改变成is
    val s2 = "${s1.replace("是", "is")}, but now is $a"
    println(s2);
}

5、使用条件表达式,求最大值max

  • 1、无return返回的求最大值,
//找最大值
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}
  • 2、不使用return
fun max1(a : Int ,b : Int) = if(a>b) a else b;

6、使用类型检测及自动类型转换

注意:这里的is相当于java的instanceof关键字

//is的使用,?允许返回null,Any表示任何类型
//当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引⽤可为空
fun isStr(obj : Any) : Int ?{   
    // `obj` 在 `&&` 右边⾃动转换成 `String` 类型
    if (obj is String && obj.length > 0) {
        return obj.length
    }
    return null
}
  • 或者
fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // `obj` 在这一分支自动转换为 `String`
    return obj.length
}

7、String字符串对比

注意:比较字符串的内存地址,相当于Java的str1==str2,输出false

//字符串对比
fun biaojiaoStr1(){
    
    var str1 = "abc"
    var str2 = String(charArrayOf('a','b','c'))
    
    //比较字符串的值,输出true
    println(str1.equals(str2))
    
    //比较字符串的值,输出true
    println(str1==str2)
    
    //比较字符串的内存地址,相当于Java的str1==str2,输出false
    println(str1===str2)
}

8、使用可空值及 null 检测

  • 当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引用可为空,如果 str 的内容不是数字返回 null:
fun parseInt(str: String): Int? {
    // ……
}

*使用返回可空值的函数:

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // 直接使用 `x * y` 会导致编译错误,因为他们可能为 null
    if (x != null && y != null) {
        // 在空检测后,x 与 y 会自动转换为非空值(non-nullable)
        println(x * y)
    }
    else {
        println("either '$arg1' or '$arg2' is not a number")
    }    
}
  • 或者
// ……
if (x == null) {
    println("Wrong number format in arg1: '$arg1'")
    return
}
if (y == null) {
    println("Wrong number format in arg2: '$arg2'")
    return
}

// 在空检测后,x 与 y 会自动转换为非空值
println(x * y)

9、for 循环的使用

  • for 循环的使用
val items = listOf("苹果", "香蕉", "橙子")
for (item in items) {
    println(item)
}

//或者
val items = listOf("苹果", "香蕉", "橙子")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}

10 使用 while 循环

val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

11、使用 when 表达式

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

12、使用区间(range)

  • 使用 in 运算符来检测某个数字是否在指定区间内
val x = 10
val y = 9
if (x in 1..y+1) {
    println("fits in range")
}
  • 检测某个数字是否在指定区间外
val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {
    println("-1 is out of range")
}
if (list.size !in list.indices) {
    println("list size is out of valid list indices range, too")
}
  • 区间迭代:
for (x in 1..5) {
    print(x)
}
  • 或数列迭代:
for (x in 1..10 step 2) {
    print(x)
}
println()
for (x in 9 downTo 0 step 3) {
    print(x)
}

13、使用集合

  • 对集合进行迭代:
for (item in items) {
    println(item)
}
  • 使用 in 运算符来判断集合内是否包含某实例
when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is fine too")
}
  • 使用 lambda 表达式来过滤(filter)与映射(map)集合:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
  .filter { it.startsWith("a") }
  .sortedBy { it }
  .map { it.toUpperCase() }
  .forEach { println(it) }

14、创建基本类及其实例

注意:不需要“new”关键字

val rectangle = Rectangle(5.0, 2.0) // 不需要“new”关键字
val triangle = Triangle(3.0, 4.0, 5.0)

15、split 分隔符的使用

  • split支持多个特殊进行切割,kotlin的split比java的split强
fun split(){
    var str = "苹果,香蕉-橙子"
    //支持多个特殊进行切割,以,和-进行分割
    var strs = str.split(",","-")
    for(s in strs){
        println(s)
    }
}
  • 输出的结果为
苹果
香蕉
橙子

16、substring的使用

//substring的使用

fun subStr(){
    val path = "/Users/ljl/kotlin/chapter.doc";
    
    //获取前6个字符
    println(path.substring(0,6))
    //使用范围获取前6个字符
    println(path.substring(0..5))
    
    //把第一个r之前的字符串截取
    println(path.substringBefore('r'))
    
    //把最后一个r之前的字符串截取
    println(path.substringBeforeLast('r'))
    
    //把第一个r之后的字符串截取
    println(path.substringAfter("r"))
    
    //把最后一个r之后的字符串截取
    println(path.substringAfterLast("r"))
    
}

17、元祖使用

//元祖使用
fun pair(){
    
    //定义一个二元元组
    var pair  = Pair<String,Int>("我是寅务",29)
    var pair1 : Pair<String,Int> = "我是寅务" to 29
    
    println(pair.first + "," +pair.second)
    println(pair1.first + "," + pair1.second)
    
    //定义一个三元元组
    var triple  = Triple<String,Int,String>("我是寅务",29,"岁")
    
    println(triple.first + "," +triple.second + "," + triple.third)
}

18、?与!!的使用区别

  • ? 可空变量类型
  • ? 表示可以为空,不加表示不能为空
  • ?. 空安全调用符,这种做法先显眼就是为了判断非空值如同 if(age !=null)
  • !! 非空判断
  • !!表示告诉kotlin编辑器,此值不要检查了,password一定不为空, 这种值处理如果不确定的话显眼不安全 ,不建议使用
fun testNull(){

    // ? 可空变量类型
    val age : Int? = null

    // !! 非空判断
    var userName : String  = null !!
    // ? 表示可以为空,不加表示不能为空
    var passWord : String?  = null  

    // ?. 空安全调用符,这种做法先显眼就是为了判断非空值如同 if(age !=null) age.toI
    println(age?.toInt())
    
    //?: elvis操作符(猫王),age?.toInt()表示if(age!=null) age.toInt else 返回 默认就给10
    var ageInt : Int = age?.toInt() ?: 10

    println(ageInt)
    
    //!!表示告诉kotlin编辑器,此值不要检查了,password一定不为空,
      // 这种值处理如果不确定的话显眼不安全 ,不建议使用
    passWord!!.toInt()
}

19、注释

  • 正如 Java 与 JavaScript,Kotlin 支持行注释及块注释,与 Java 不同的是,Kotlin 的块注释可以嵌套
// 这是一个行注释

/* 这是一个多行的 块注释。 */

20、函数的参数默认

//函数的参数默认
fun defVal(age:Int,username:String = "liangjl"){
    println("$username,$age")
}

21、vararg 可变参数

vararg 是可变参数,相当于java的三个点:String ... strs但是java的可变参数必须要在方法的最后一个参数

fun varargs(vararg a : Int ):Int{   
    var result =0
    a.forEach {
        result += it        
    }
    return result;
}
  • vararg 使用
println(varargs(10,20,30))
  • Java 的可变参数代码
public static void TestArgs(String userName,String ... args){
  // 省略
}

工程源代码

工程例子源代码
文章参考官方reference与个人学习整理

Kotlin包的详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容