kotlin入门

变量和函数

变量

  • val 不可变变量,无法再次赋值
  • var 可变变量
  • 强制类型转换:变量 as 类型
//主函数
fun main() {
    //自动推导成整型变量
    var a = 10
    //显式声明变量类型
    //kotlin中没有基本数据类型,全部使用对象数据类型,首字母大写
    var b: Int
    //延迟初始化
    lateinit var c :Int
    //判断是否初始化
    if(!::c.isInitialized){
        c=100
    }
}

集合

fun main() {
    //不可变数组
    val list = listOf("Apple","banana","orange","pear")
    //可变数组
    val mutlist = mutableListOf("Apple","banana","orange","pear")
    mutlist.add("watermelon")
    
    //集合,map同理
    val set = setOf("Apple", "banana", "orange", "pear")
    val mutableSet = mutableSetOf("Apple", "banana", "orange", "pear")
    val mapOf = mapOf("apple" to 1, "banana" to 2)

    //map
    val map = HashMap<String, Int>()
    //相当于put
    map["Apple"] = 1
    map["orange"] = 2
    //相当于get
    val number = map["Apple"]

}

函数

fun+函数名+(变量:变量类型,......)+:返回类型+{}
fun largerNumber(a: Int, b: Int): Int {
    return max(a, b)
}
//当函数只有一行代码时不用写函数体,用等号连接代码
fun largerNumber2(a: Int, b: Int): Int = max(a, b)
//返回值类型可自动推断
fun largerNumber3(a: Int, b: Int) = max(a, b)
//函数参数默认值(类似python)
fun printParams(num : Int = 100,str :String){
    println("number is $num,str is $str")
}
//使用时可以使用键值对
fun main() {
    printParams(num = 10,str = "zhaolu")
    //输出number is 10,str is zhaolu
}

静态方法(类方法)

使用companion object实现近似静态方法

class FuncDemo {
    companion object{
        fun doAction(){
            print("do action")
        }
    }
}
fun main() {
    FuncDemo.doAction()
    //输出do action
}

也可以使用顶层方法

创建一个Helper kotlin file,里面写方法,其他类可以直接使用此函数

//Helper
fun doSomething(){
    println("do something")
}
//其他类
fun main() {
    doSomething()
    //输出do something
}

逻辑控制

if

/*
* if语句使用方法同java
* if可以有返回值
* */
fun largerNumber(a: Int, b: Int) = if (a > b) a else b

when

/*
* when相当于switch
* 匹配值 -> 执行语句
* */
fun getScore(name: String) = when (name) {
    "Tom" -> 100
    "Jack" -> 95
    "Lily" -> 80
    else -> 0
}
//可判断数据类型,用Int
fun checkNumber(num :Number) {
    when (num){
        is Int -> print("number is Int")
        is Double -> print("number is Double")
        else -> print("don't know")
    }
}

while

同java

for

类似python

//定义区间,闭区间
val range = 1..5
for (i in range){
    print(i);
}
println(" ")

//左闭右开
val range2 = 0 until 5
for (i in range2) {
    print(i)
}
println(" ")

//设置步长
for(i in 0 until 10 step 2){
    print(i)
}
println(" ")

//降序
for(i in 10 downTo 1){
    print(i)
}

面向对象

类与对象

类的定义与继承

//加open关键字才可以继承,默认不可以继承
open class Person{
    var name =""
    var age = 0
    fun eat(){
        println(name+"is eating"+",his age is "+age)
    }
}

//继承使用:clsaasName(),子类的构造函数必须调用父类的构造函数
class Student : Person(){
    var sno = ""
    var grade = 0
}

//类名后加主构造函数
//init块中可以写主构造函数逻辑
class Student2(val sno :String,val grade:Int):Person(){
    init {
        println("Sno is"+sno)
        println("Grade is"+grade)
    }
}
open class Person2(val name:String ,val age:Int){
    fun eat(){
        println(name+"is eating"+",his age is "+age)
    }
}

//class Student3(val sno :String,val grade:Int):Person2(){}  //No value passed for parameter 'age'

//继承有主构造函数的父类
class Student3(val sno :String,val grade:Int,name: String,age: Int):Person2(name,age){
    //次构造函数
    constructor(name: String,age: Int):this("",0,name,age){}
    constructor():this("",0)
}

类实例的创建

fun main() {
    //创建对象省略new
    var p = Person()
    //kotlin中去掉了get,set方法,直接使用 .属性名 赋值
    p.name = "Tom"
    p.age = 10
    p.eat()
    val s1 = Student2("01921210001",100)
}

接口

定义

interface Study {
    fun readBook()
    //接口方法默认实现
    fun doHomeWork(){
        println("doHomework default implementation")
    }
}

使用接口

//继承实现统一使用冒号,用逗号分隔
class StuInterface(name: String, age: Int) : Person2(name, age), Study {
    override fun readBook() {
        println("read book")
    }
}

fun main() {
    val s = StuInterface("tom", 20)
    s.doHomeWork()
    s.readBook()

}

修饰符

  • public:默认,所有类可见
  • private:同java,只对当前类可见
  • protected:只在当前类和子类使用(与java不同)
  • internal:只对同一模块的类可见

数据类

//数据类自动生成equals(),hashcode(),tostring()方法
data class CellPhone(val brand:String,val price:Int)

单例类

//单例类,使用object
object Singleton {
    fun singletonTest(){
        println("singletonTest is called")
    }
}
fun main() {
    Singleton.singletonTest()
}

密封类

当when传入一个密封类,会自动检查该密封类的子类,强制要求处理每个子类

sealed class Result
class Success(val msg:String):Result()
class Failure(val error:Exception):Result()

Lambda编程

  • 形式:{参数1:类型,参数2:类型 -> 函数体}
  • 当lambda参数是函数最后一个参数可以拿到外边
  • 当lambda参数是唯一参数括号可以不写
  • 当参数列表只有一个可以用it代替,不用声明参数名
fun main() {
    val list = listOf("Apple","banana","orange","pear")
   
    //原始写法,maxByOrNull根据传入的条件遍历,找到最大值
    val lambda = { fruit: String -> fruit.length }
    val maxLen = list.maxByOrNull(lambda)
    //省略写法
    println("max is "+list.maxByOrNull { it.length })

    //map把集合中的函数映射成为另一个值
    val map = list.map { it.toUpperCase() }
    for (s in map) {
        println(s)
    }
    //flilter过滤
    val filter = list.filter { it.length <= 5 }
    for (s in filter) {
        println(s)
    }
    
    val any = list.any { it.length <= 5 }
    val all = list.all { it.length <= 5 }
    println("any is "+any)
    println("all is "+all)

    Thread{ print("thread is start")}.start()
}

空指针检查

//变量不许为空,如果需要为空,在后面加?
class Study {
    fun readBook(){
        println("read book")
    }
    fun doHomework(){
        println("do homework")
    }
}
fun doStudy(study: Study){
    study.doHomework()
    study.readBook()
}
//变量不许为空,如果需要为空,在后面加?
fun doStudy2(study: Study?){
    study?.doHomework()
    study?.readBook()
}
fun main() {
    //Null can not be a value of a non-null type Study
//    doStudy(null)
    doStudy2(null)
}

val c = if(a!=null){
    a
}else {
    b
}
//可以简化为
val c = a ?: b
//非空断言语句,在变量后加!!,不推荐

let函数

obj调用let函数,立即执行lambda表达式代码,同时将obj传递到表达式中,即obj2

obj.let{obj2->
    //执行语句
}
//作为空指针判断辅助工具
fun doStudy3(study: Study?){
    study?.let { stu ->
        stu.doHomework()
        stu.readBook()
    }
}
fun doStudy4(study: Study?){
    study?.let {
        it.readBook()
        it.doHomework()
    }
}

其他技巧

字符串内嵌表达式

//使用${obj.name}
fun main() {
    val brand = "xiaoMi"
    val price = 1999
    println("$brand's price is $price")
    //输出xiaoMi's price is 1999
}

with函数

两个参数,第一个参数为任意类型的对象,第二个参数为lambda表达式,在lambda表达式中提供第一个参数对应的上下文,并使用最后一行代码作为返回值

fun main() {
    val list = listOf("apple","banana")
    val res = with(StringBuilder()){
        for (s in list) {
            append(s)
            append("\n")
        }
        //返回值
        toString()
    }
    println(res)
}

run函数

类似with

fun main() {
    val list = listOf("apple","banana")
    //只有此处有区别
    val res = StringBuilder().run {
        for (s in list) {
            append(s)
            append("\n")
        }
        toString()
    }
    println(res)
}

apply函数

类似run,区别在于无返回值,返回调用对象本身

fun main() {
    val list = listOf("apple","banana")
    //res为StringBuilder类型
    val res = StringBuilder().run {
        for (s in list) {
            append(s)
            append("\n")
        }
    }
    //需要加toString()
    println(res.toString())
}

repeat函数

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

推荐阅读更多精彩内容