函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
函数式接口实例
Predicate <T> 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。
该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
该接口用于测试对象是 true 或 false。
我们通过Lambda表达式来表示某个接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
package com.test.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* 函数式接口
*
* @author smallk
* @date 2019/2/28 16:44
*/
public class FunctionalInterfaceTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println("输出所有数据");
// Predicate<Integer> predicate = n -> true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true
eval(list, n -> true);
System.out.println("输出所有偶数:");
eval(list, n -> n % 2 == 0);
System.out.println("输出大于 3 的所有数字:");
eval(list, n -> n > 3);
// message -> System.out.println(message) 等价于 System.out::println
GreetingService greetingService = System.out::println;
greetingService.sayMessage("你好啊!");
}
private static void eval(List<Integer> list, Predicate<Integer> predicate) {
for (Integer n : list) {
if (predicate.test(n)) {
System.out.println(n);
}
}
}
@FunctionalInterface
interface GreetingService {
/**
* sayMessage
*
* @param message String
*/
void sayMessage(String message);
/**
* 函数式接口里允许定义默认方法
*/
default void doSomeMoreWork() {
// Method body
}
/**
* 函数式接口里允许定义静态方法
*/
static void printHello() {
System.out.println("Hello");
}
/**
* 函数式接口里允许定义 java.lang.Object 里的 public 方法
*
* @param obj Object
* @return boolean
*/
@Override
boolean equals(Object obj);
}
}
关于 @FunctionalInterface 注解
Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
提醒:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。
函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义。
函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义。
函数式接口里允许定义 java.lang.Object 里的 public 方法
函数式接口里是可以包含 Object 里的 public 方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现。
源于:http://www.runoob.com/java/java8-functional-interfaces.html