第一课
类型可推导:
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实现函数传递的方法,使用接口,然后抽象方法,匿名内部类