Updated on 2017-02-13

Kotlin

fun main(args: Array<String>) {
    a({ s -> println(s) })     Lambda 表达式
    等同于
    a { s -> println(s) }     移至括号外并省略括号
    等同于
    a { println(it) }     使用 `it` 替代
    等同于
    a(::println)     使用函数引用
}
等同于
fun main(args: Array<String>) = a(::println)     函数体只含有 1 句表达式省略函数体和返回值

----

fun a(block: (String) -> Unit): Unit {     高阶函数函数参数使用函数类型表达)(函数为一等公民
    block("ABC")
}
等同于
fun a(block: (String) -> Unit) {     省略 Unit (void) 返回值
    block("ABC")
}
等同于
fun a(block: (String) -> Unit) = block("ABC")     函数体只含有 1 句表达式省略函数体和返回值

-------------------------------------------------------
Finally
fun main(args: Array<String>) = a(::println)

fun a(block: (String) -> Unit) = block("ABC")

----
输出
ABC

Java

public class Main {
    public static void main(String[] args) {
        a((String s) -> {     Lambda 表达式
            System.out.println(s);
        });
        等同于
        a((String s) -> System.out.println(s));     方法体只含有 1 条执行代码转为表达式省略方法体和返回值
        等同于
        a(s -> System.out.println(s));     省略参数类型
        等同于
        a(System.out::println);     使用方法引用
    }

    private static void a(A a) {     假高阶函数函数参数使用接口表达)(只支持传递对象不支持传递方法
        a.a("ABC");
    }
}

@FunctionalInterface
interface A {
    void a(String str);
}

-------------------------------------------------------
Finally
public class Main {
    public static void main(String[] args) {
        a(System.out::println);
    }

    private static void a(A a) {
        a.a("ABC");
    }
}

@FunctionalInterface
interface A {
    void a(String str);
}

----
输出
ABC

对比

Kotlin
fun main(args: Array<String>) = a(::println)

fun a(block: (String) -> Unit) = block("ABC")     函数类型表达函数为一等公民
Java
public class Main {
    public static void main(String[] args) {
        a(System.out::println);
    }

    private static void a(A a) {     接口表达只支持传递对象不支持传递方法
        a.a("ABC");
    }
}

@FunctionalInterface
interface A {
    void a(String str);
}