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]
来源:CSDN
作者:xiangxiongfly915
链接:https://blog.csdn.net/qq_14876133/article/details/104655533