Kotlin学习(三) : 函数

2018-08-27  本文已影响24人  8ba406212441

学习笔记

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
    }
上一篇下一篇

猜你喜欢

热点阅读