前面介绍过kotlin函数的基本写法,也提到过lambda函数,这里进一步认识一下lambda函数。另外还会简单的介绍一下解构,泛型,kotlin中的函数式编程。
- Lambdas
这个语法基本和swift中的用法一致
fun main() {
fun handleInteger(myInt: Int, operation: (Int) -> Unit) {
operation(myInt)
}
fun printNumber(num: Int) {
println("the integer is ${num}")
}
// lambda的2种写法
val printNumber2 = { x: Int -> println("the integer is $x") }
val printNumber3: (Int) -> Unit = { println("the integer is ${it}") }
handleInteger(10, ::printNumber)
handleInteger(20, printNumber2) // 注意传入lambda时不需要 "::" 进行引用
handleInteger(30, printNumber3)
// 下面3种写法和swift中的一致 swift中称之为尾部闭包
handleInteger(40, { num -> println("the integer is ${num}") })
// 使用 it 默认关键词进行简写
handleInteger(40, { println("the integer is ${it}") })
// 直接将整个函数提到最外层
handleInteger(50) {
println("the integer ${it}")
}
}
知识点:
- 函数可以作为参数传入另一个函数
- 函数lamda的几种写法
- 函数中使用
it
关键词简写 - 普通函数传入函数时,需要使用
::
进行引用,比如上面的handleInteger(10, ::printNumber)
; 而使用lambda声明的函数则不需要使用::
进行引用,比如handleInteger(20, printNumber2)
- 函数尾部回调 的写法
- 解构
这个特性还比较好,和js中的解构比较像
// js 写法
const obj = {
name: 'james',
age: 10
}
const { name, age } = obj;
同样kotlin中类似:
// kotlin 写法
// data 关键词修饰class 是个啥 暂时不清楚 😝
data class Person(val name: String, val age: Int)
val sam = Person("james", 20)
val (name, age) = sam // 解构
println("$name's age is $age")
- 泛型
这个大多数语言中都类似,但是kotlin的写法,稍微感觉有点怪怪的 🤣
// 接口
// T 即泛型类
interface Repository<T> {
fun addItem(item: T)
fun deleteItem(item: T)
}
class Person(val name: String) {}
// 实现接口
class PersonRepository: Repository<Person> {
// 实现接口中的方法
override fun addItem(item: Person) {}
override fun deleteItem(item: Person) {}
}
// 为啥函数名的前面还要加一个 <T> ???
// 看起来怪怪的 😁
fun <T> printSomething(item: T) {
println(item)
}
fun <T> printList(list: List<T>) {
list.forEach {
print("list item: $it")
}
}
- kotlin 函数式编程
函数式编程看来是大多数的趋势了,使用起来比较简洁,声明式的写法可读性也比较高。
kotlin函数式编程是由kotlin内部提供了多种操作符。下面是学习时暂时接触到的操作符
first
indexOfFirst
any
all
filter
map
val nums = listOf(10, 20, 80, 4, 1)
val firstNumberGreaterThan14 = nums.first { it > 15 } // 返回20
val firstIndexGreaterThan30 = nums.firstIndex { it > 30 } // 返回 2
// 是否存在小于5的数
val isNumberLessThan5 = nums.any { it < 5 } // true
// 所有数都大于45
val allNumberGreaterThan45 = nums.all { it > 45 } // false
// 过滤小于30的数
val listGreaterThan30 = nums.filter { it > 30 } // [80]
// 给所有数乘以2
val doubleNums = nums.map { it * 2 } // [20, 40, 160, 8, 2]
这里只是简单的列举了一些操作符,实际使用的时候查一下文档即可。关于函数式编程可参考:
总的来说kotlin这些特性基本上和其他语言没太大区别,写法上稍微有点不同而已。
2019年07月29日00:09:21