Java Lambda表达式

65 阅读1分钟

只有一个方法发接口称为函数式接口,由@FunctionalInterface指明,加上这个注解,IDE会做检查,如果多写了方法会报错,不加注解没有其他影响。Runnable接口就是函数式接口:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

Lambda表达式是对函数式接口的匿名内部类(对象)的简写,(在python中Lambda表达式叫匿名函数),如Thread类的一个构造方法要求传入一个实现了Runnable接口的类的对象:

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

使用匿名内部类可以写作:

new Thread(new Runnable() {
    @Override
    public void run() {
        // ...
    }
}).start();

使用Lambda表达式可以简写为:

new Thread(()-> System.out.println("Hello World!")).start();

一般格式

image.png

interface lambdaTest {
    int f(int x, int y);
}
lambdaTest t = (int x, int y) -> {
    return x + y;
};

语法简写

  • 参数类型可以省略
  • 只有一个参数时,小括号可以省略
  • 方法体只有一条语句时,大括号可以省略,如果该条语句是返回语句,return也可以省略

Java提供了几种写好的函数式接口供使用:

  • Function:一个入参,一个返回值
  • Consumer:一个入参,无返回值
  • Supplier:无入参,一个返回值

还有些两个参数的BiFunction等

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
    ...
}
@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    ...
}
@FunctionalInterface
public interface Supplier<T> {
    T get();
}

集合中的Lambda表达式例子:

ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("lambda");
list.sort((o1, o2) -> o1.length() - o2.length());
list.forEach(s -> System.out.println(s));

HashMap<Integer, String> map = new HashMap<>();
map.put(3, "hello");
map.put(4, "lambda");
map.forEach((integer, s) -> System.out.println(integer + " " + s));