只有一个方法发接口称为函数式接口,由@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();
一般格式
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));