Kotlin 函数式编程

别来无恙 提交于 2020-03-05 01:31:54

Kotlin函数式编程

函数式编程是一种编程典范,面向函数的编程,只用纯函数来构建程序,在函数式编程中一切都是函数。

Lambda

Java

//普通方法
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show();
    }
});

//Lambda
btn.setOnClickListener(v -> Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show());

Kotlin

//普通方法
btn.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
        Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show()
    }
})

//Lambda
btn.setOnClickListener({ v ->
                        Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show()
                       })

//Lambda简化,可省略小括号
btn.setOnClickListener { v ->
                        Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show()
                       }
//只有一个参数,可省略
btn.setOnClickListener {
    Toast.makeText(mContext, "hello", Toast.LENGTH_SHORT).show()
}

闭包

闭包是指能够读取其他函数内部变量的函数。

fun main() {
    val a = add()
    a(999)//1000
}

fun add(): (i: Int) -> Unit {
    var count = 1
    return fun(i) {
        println(count + i)
    }
}

let

限定作用域

判断null操作

//Java
String data = "abc";
if (data != null) {
    System.out.println(data.length());
}

//Kotlin
var data: String = "abc"
data?.let {//data不为null才会执行let函数
    println(it.length)
}

also

类似let函数,但区别在于返回值不同

let函数,返回值为最后一行或return表达式

also函数,返回值为传入的对象本身

class Person(var name: String) {
    override fun toString(): String {
        return "Person(name=$name)"
    }
}

var p = Person("name")
var p2 = p.also {
    it.name = "Tom"
}
println(p2)//Person(name=Tom)

with

方便直接调用对象的方法名和属性

class Person(var name: String, var age: Int)

var p = Person("Tom", 10)
with(p) {
    println("name:$name, age:$age")//name:Tom, age:10
}

run

结合let和with函数

class Person(var name: String, var age: Int)

var p = Person("Tom", 10)
p?.run {
    println("name:$name, age:$age")//name:Tom, age:10
}

apply

与run函数类似,区别在于返回值

run函数返回最后一行或return表达式

apply返回传入对象

有利于用于简化初始化对象。

class People {
    var name: String = "Tom"
    var age: Int = 18
    override fun toString(): String {
        return "People(name='$name', age=$age)"
    }
}

fun main() {
    val p1 = People()
    println(p1)//People(name='Tom', age=18)

    val p2 = People().apply {
        name = "Jim"
        age = 22
    }
    println(p2)//People(name='Jim', age=22)
}

forEach

val list = listOf(1, 2, 3, 4, 5)
list.forEach {
    println(it)
}

maxBy

获取最大值

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val max = list.maxBy { it }
println(max)//651

filter

过滤函数

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val filter = list.filter { it > 20 && it < 100 }
println(filter)//[23, 33]

map

数据转换,创建新的集合

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val map = list.map { it.toDouble() }
println(map)//[11.0, 1.0, 23.0, 33.0, 4.0, 5.0, 651.0, 9.0]

any

判断函数

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val any = list.any { it == 23 }
println(any)//true

count

统计函数

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val count = list.count { it > 30 }
println(count)//2

find

查找函数,只返回第一个值

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val find = list.find { it > 30 }
println(find)//33

groupBy

分组函数

val list = listOf(11, 1, 23, 33, 4, 5, 651, 9)
val groupBy = list.groupBy { it > 30 }
println(groupBy)//{false=[11, 1, 23, 4, 5, 9], true=[33, 651]}
println(groupBy[false])//[11, 1, 23, 4, 5, 9]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!