本文关键词:Java 8, 函数式接口,lambda 。
介绍
源码:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
说明:
根据源码注释,
- 该注解只能用于接口,不能用于注解、枚举、类。
- 被注解的类型,必须满足函数式接口的条件。
函数式接口条件:
- 只能有一个抽象方法(abstract method)。
- default 方法因为是有具体实现的,所以不算抽象方法。
- 抽象方法不能和 java.lang.Object 的方法相同。
函数式接口的实例,可以用于 lambda 表达式、函数引用、构造器引用。
示例
定义函数式接口如下:
@FunctionalInterface
public interface IProcessor<T> {
void process(T t);
}
Java 8 之前的写法:
public class Main {
public static void main(String[] args) {
IProcessor<Long> processor = new IProcessor<Long>() {
@Override
public void process(Long aLong) {
System.out.println(aLong);
}
};
processor.process(123L);
}
}
使用 Java 8 的 lambda 写法:
public class Main {
public static void main(String[] args) {
IProcessor<Long> processor = aLong -> {
System.out.println(aLong);
};
processor.process(123L);
}
}
使用 lambda + 函数引用:
public class Main {
public static void main(String[] args) {
IProcessor<Long> processor = System.out::println;
processor.process(123L);
}
}