data class Person(val name: String, val age: Int)
fun main(vararg args: String){
val people = listOf<Person>(
Person("Alice",29),
Person("Bob",31)
)
//使用隐含对象
println(people.maxBy { it.age })
//使用成员对象引用
println(people.maxBy(Person::age))
//类Java
println(people.maxBy{ p: Person -> p.age})
}
Lambda句法
//Java
static IntBinaryOperator add = (x, y) -> x + y;
public static void main(String...args){
add.applyAsInt(1,2)
}
//Kotlin
val sum= { x: Int, y: Int -> x + y }
fun main(vararg args: String){
sum(1,2)
}
咋一看挺迷惑的,需要看看Java中的写法
因为上面说了Lambda是个对象,那么对象能像函数一样调用呐?
证实了我们的观点,确实是个对象,sum()应该是sum.invoke()的语法糖吧
直接调用Lambda
{ x: Int, y: Int -> x + y }(1,2)
//run适用于无参数的Lambda
run { print(24)}
publicstaticvoidmain(String...args){
int i = 0;
Runnable r = () -> {
i++;//会报错
};
}
//只能这么做static class I{
publicstaticint i = 0;
}
publicstaticvoidmain(String...args){
Runnable r = () -> {
I.i++;
};
}
但是在Kotlin中可以
var count = 0
val inc = { count++ }
成员引用
可以视为Java反射包中的Field和Method
data class Person(val name: String, val age: Int)
Person::age//property agefun sulate() = println("aaa")
val a = run(::salute)//function add//构造器引用val createPerson = ::Person
val p = createPerson("Alice", 29)
val personAgeFunction = Person::age
println(personAgeFunction(p)) //29val thisPersonAgeFunction = p::age
println(thisPersonAgeFunction()) //29