kotlin学习

11 篇文章 0 订阅

第一课

        类型可推导:

                1.var:可读可写变量

                2.val:只读变量

                3.编译时常量:canst val(必须定义在函数之外,因为函数内的变量是在运行时才被调用的,编译时常量需要在变量赋值前就存在,所以不能在函数内定义,编译时常量只能是基本数据类型,Byte,Short,Int,Long,Float,Double,Char,String)

//可读可写变量 var
//只读变量 val
/*编译时常量 const val,必须在函数外定义,
因为函数都是在运行时才调用,函数内的变量也是在运行时才被调用,编译时常量要在这些变量赋值前就已经存在
编译时常量只能是常见的基本数据类型:Byte,Short,Int,Long,Float,Double,Char,String,Boolean
类似于java中的 public final static*/
//类型可推倒

const val PI = 3.14
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        println("fule--"+"hello world")
    }
}

字节码:

  // access flags 0x19
  public final static D PI = 3.14

函数:

        具名函数

        参数:参数默认值,具名参数

getData(name = "999")//具名参数

//函数默认值
    private fun getData (name:String = "张三"):String{
        return "$name"
    }

        匿名函数

        函数可以直接赋值给一个变量

    //匿名函数赋值给变量
    val infomation :() ->String = {
        "nihao"
    }

    //匿名函数赋值给变量(无参数类型可推导,所以删除类型)
    val infomation0  = {
        "nihao"
    }

    //匿名函数赋值给变量(带一个参数时,参数名可以用it代替)
    val infomation1 :(name:String) ->String = {
        "$it nihao"
    }

    //匿名函数赋值给变量(参数里只声明参数类型,只有一个参数时可以使用it,多个参数时需要在{}中声明变量名)
    val infomation2 :(String,Int) ->String = {name,age ->
        "$name nihao,$age"
    }
    
    //匿名函数赋值给变量(有参数有返回值时省略函数类型)
    val infomation3 = {name:String,age: Int ->
        "$name nihao,$age"
    }
    

        函数的参数是另一个参数

package com.fulele.kotlinlearn

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val getDiscontWords = {name :String,hour :Int ->
            "2022年,双十一 $name 促销倒计时:$hour 小时"
        }
        //第一种写法:参数传入一个类型为匿名函数的对象
        showOnBoard("卫生纸",getDiscontWords)

        //第二种写法:参数直接传入匿名函数
        showOnBoard("卫生纸",{name :String,hour :Int ->
            "2022年,双十一 $name 促销倒计时:$hour 小时"
        })

        //第三种写法:当函数的参数的最后一个参数为larmdar表达式,其余的参数继续使用(),
        //最后一个参数使用{} 写在()外
        //当函数的只有一个参数并且参数为larmdar表达式,这可以省掉(),{},里就代表函数的参数

        showOnBoard("卫生纸") { name: String, hour: Int ->
            "2022年,双十一 $name 促销倒计时:$hour 小时"
        }

    }

    fun showOnBoard(good:String,show:(String,Int) -> String){
        println(show(good,24))
    }
}

函数的內联

inline,递归不可以使用内联函数

package com.fulele.kotlinlearn

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        showOnBoard("卫生纸") { name: String, hour: Int ->
            "2022年,双十一 $name 促销倒计时:$hour 小时"
        }
    }

    //内联
    inline fun showOnBoard(good:String,show:(String,Int) -> String){
        println(show(good,24))
    }
}

函数引用

        要把函数作为参数传给其他函数使用,除了传lambda表达式,kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。

        ::方法名:可以把具名参数当作参数进行传递

package com.fulele.kotlinlearn

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //::函数引用,可以直接传递具名函数
        showOnBoard("卫生纸",::getDiscontWords)
    }

    private fun getDiscontWords (name:String,hour:Int) :String{
        return "2022年,双十一 $name 促销倒计时:$hour 小时"
    }
    private inline fun showOnBoard(good:String,show:(String,Int) -> String){
        println(show(good,24))
    }
}

函数类型作为返回类型

package com.fulele.kotlinlearn

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val ccc = configDiscountWorld()
        println(ccc(""))
    }

    fun configDiscountWorld() :(String)->String{
        return {name:String ->
            "2022年,双十一 $name 促销倒计时:2 小时"
        }
    }
}

闭包

匿名函数就是lambda,lambda就是闭包

匿名函数能修改并引用定义在自己的作用域之外的变量,匿名函数引用这定义在自身的函数里的变量,如下,匿名函数使用的在自身之外的year和hour,也使用了自身的name

能接受函数或者返回函数的函数又叫高级函数,高级函数广泛应用于函数式编程当中

fun configDiscountWorld() :(String)->String{
        val year  = "2022"
        val hour = 2
        return { name:String ->
            "$year 年,双十一 $name 促销倒计时:$hour 小时"
        }
    }

java实现函数传递的方法,使用接口,然后抽象方法,匿名内部类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值