Kotlin学习(三) : 函数
学习笔记
1,主构函数和次构函数constructor ,调用了次构函数,也会先调主构函数.再执行次构函数
constructor :super
2,继承 父类需要加上open关键字 , 子类继承父类用:表示继承或实现
open class Father {} //需要加上open才能被继承,方法也是一样
class son1 :Father(){
//子类里面字段和方法需要加上override关键字
override var name: String = "大头儿子"
}
3, kotlin的接口是可以实现的
interface Drivel{
fun driveCar(){
println("")
}
}
4, kotlin 的is 相对于java中的instanceof ,判断是否是这个类型
if(animal is dog){
val animal1 = animal as dog //将animal强转成dog类型,在kotlin只要判断了就不需要强转了,它会只能转换.
}
5,lazy()是接受一个 lambda 并返回一个 Lazy <T> 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用 get() 只是返回记录的结果。
lazy{} 只能用在val类型, lateinit 只能用在var类型 如 :
val name: String by lazy { "sherlbon" }
lateinit var adapter: MyAdapter
.lateinit不能用在可空的属性上和java的基本类型上 如:
lateinit var age: Int //会报错
lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义
6,SetOnclickListener函数 转换
例如,setOnClickListener函数,在Java中时这样定义的:
public void setOnClickListener(OnClickListener l) {
...
}
而在Kotlin中我们使用它时,可以这样:
fun setOnClickListener(l: (View) -> Unit)
创建OnClickListener的匿名类:
view.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
toast("Hello")
}
})
建议你用Lambda方法,转换:
view.setOnClickListener({ v -> toast("Hello") })
如果函数的最后一个参数是函数,它能够移到圆括号外面。
如果我们有多个参数,其余的参数则在圆括号内,即使这些参数是函数。仅仅最后一个参数能够提出来。
view.setOnClickListener() { v -> toast("Hello") }
如果函数仅有一个参数,且它是一个函数,则圆括号能删除
view.setOnClickListener { v -> toast("Hello") }
如果你不用Lambda参数,你可以删除函数的左边部分
如果你仅有一个参数这是正确。不使用视图(v),就可以删除它:
view.setOnClickListener { toast("Hello") }
另外,在函数仅接收参数,则不是在左边定义,而是用保留字it,节省一些字符。
例如,如果我们用视图传递它到另一个方法:
view.setOnClickListener { v -> doSomething(v) }
我们可以选择简单的用it:
view.setOnClickListener { doSomething(it) }
7,接口回调的三种写法
public interface OnSelectedListener {
void onSelected(int position,ListValueBean bean);
}
函数.png
dialog.setListener { position, bean ->
}
dialog.setListener(object : BottomListDialog.OnSelectedListener{
override fun onSelected(position: Int, bean: BottomListDialog.ListValueBean?) {
}
})
dialog.setListener(object : ((Int,BottomListDialog.ListValueBean) -> Unit){
override fun invoke(p1: Int, p2: BottomListDialog.ListValueBean) {
}
})
8, 高阶函数(Higher-Order Functions)
将函数作为参数或返回一个函数,称为高阶函数。
如“lock()”函数,给对象和函数提供锁功能,获取锁,执行函数,释放锁。
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
该函数的参数“body”是一个函数类型:“() -> T”,表示为一个函数,没有入参,返回一个“T”的值。
通过下面方式调用,需要传入一个函数类型参数:
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
另外,也使用使用Lambda表示方式:
val result = lock(lock, { sharedResource.operation() })
9,Lambda表达式:
Lambda表达一般使用“{ }”包围。
它的参数(如果有的话)在“->”前定义,参数类型可能是省略的。
函数体跟在“->”后面。
在Kotlin中,若函数最后一个参数为函数类型,调用时,该参数可以放到函数“()”的外面:
lock (lock) {
sharedResource.operation()
}
另一个高阶函数例子“map()”:
泛型 T 转成R ,传入T,返回R
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
for循环
普通的for循环
Val s = “我是中国人”
for (c in s ) { //in s 找到s字符串里面所有的字符
println("c=$c")
}
加上index角标的for循环
for ((index,c) in s.withIndex()) { //需要找到字符,并且还需要找到字符位置
println("index=$index c=$c")
}
增强Foreach循环
普通foreach
Val s = “我是中国人”
s.forEach {
println("it=$it") //it代表每一个字符
}
加上index角标的foreach
s.forEachIndexed { index, c ->
println("$c 的角标是$index")
}
Continue和break的区别
Continue跳出这次循环,后面还会执行
var newstr = "abcde“
for (c in newstr) {
if(c=='c') continue
println(c) //输出 a b d e,不会输出c
}
Break跳出循环,循环停止
for (c in newstr) {
if(c=='c') break
println(c) //只输出a b 后面都不会输出
}
标签Looper ,用于多个for循环嵌套,跳出标签的for循环
Looper@for (c in s1){
for (b in s2){
if (b == '2'){
break@Looper
}
}
}
区间 Range
常见区间:IntRange CharRange LongRange
区间创建
IntRange(1,10)
1..100 //[1,100]
1 until 100//[1,100)
区间遍历:for foreach
反向区间:10 downTo 5
区间反转:intRange.reversed()
数组的定义
相同数据类型的元素按照一定顺序排列的集合
创建数组:arrayOf("haha",10,20)
创建基本数据类型数组
intArrayOf(10, 20, 30)
booleanArrayOf(true,false,true)
byteArrayOf(10,20)
…注意:没有stringArrayof
数组元素修改
var newArr = arrayOf(1,2,3,4,2,3,5)
修改某一个位置上的元素
newArr[0] = 20 //将角标0元素值设置为20
newArr.set(4,20)//将角标4元素值设置为20
查找数组元素角标
var arr = arrayOf(1,2,3,4,2,3,5)
查找第一个元素2
第一种: arr.indexOf(2)
第二种: arr.indexOfFirst {
it==2 }
查找最后一个元素2
第一种: arr.lastIndexOf(2)
第二种:arr.indexOfLast {
it == 2 }
when的使用
fun todo1(age:Int):String{
when(age){
12 -> {
return "12"
}
in 16..18 ->return "13"
else->{
return "333"
}
}
when{
age == 18 ->{
return "111"
}
age is Int -> return "222"
else ->return "111"
}
可变参数
//2,可变参数 ,params 是数组类型
fun vara(vararg params:Int):Int{
return 1
}