Java中的Lambda表达式是什么?

方法引用/λ表达式

据说在Java8中,方法也是一种类型。方法本身可以像其他数值类型或字符串类型一样作为另一个方法的参数传递。而用于传递方法的语法是方法引用和Lambda表达式。

函数式编程的基本

主要的.java

package com.company;

public class Main {
    public static void main(String[] args) {
       var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
       var ml = new MethodLambda();
       ml.walkArray(data, (String value) -> {
           System.out.printf("[%s]\n", value); // Macでは\nと書かないと改行されない!、Windowsは¥n
       });
    }
}

MethodLambda.java 的方法。

package com.company;

import java.util.function.Consumer;

public class MethodLambda {
    public void walkArray(String[] data, Consumer<String> output) {
        for (var value : data) {
            output.accept(value);
        }
    }
}

执行结果

[春はあけぼの]
[夏は夜]
[秋は夕暮れ]

不使用方法引用/匿名函数的示例

Main.java的中文释义是主要的Java文件。

package com.company;

public class Main {
    public static void main(String[] args) {
       var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
       var ml = new MethodLambda();
       ml.walkArray(data);
    }
}

MethodLambda.java的方法

package com.company;

public class MethodLambda {
    public void walkArray(String[] data) {
        System.out.printf("ラムダ式を利用しない例\n");
        for (var value : data) {
            System.out.printf("[%s]\n", value);
        }
    }
}

运行结果

ラムダ式を利用しない例
[春はあけぼの]
[夏は夜]
[秋は夕暮れ]

表示lambda表达式的语法如下:将参数列表和主体块用「->」连接起来。

(引数型 仮引数) -> {
  ...メソッドの本体...
}

通过Lambda表达式,不仅可以消除名称,还可以直接嵌入方法定义的代码以调用walkArray方法(这意味着仅需要功能而不需要名称)。这使得代码不仅更短,而且更易读,因为代码更加清晰有序。

在Java标准库(java.util.function包)中,被指定为walkArray方法参数类型的Consumer接口是一个函数式接口。

@FunctonInterface
public interFace Consumer<T> {
  void accept(T t);
}

T是泛型的类型参数。如果是一个Consumer,它表示可以接受T类型的参数并执行某些处理的方法类型(没有返回值)。

最终

由于Stream API是基于lambda表达式的,所以掌握lambda表达式是必要的技能。如果能掌握lambda表达式,就能够将传统代码简化,因此我认为将来如果不掌握这个技能,可能无法阅读他人编写的源代码。