jdk1.8之后,所谓函数式接口是指在接口中只有一个抽象方法,可以使用 @FunctionalInterface注解来约束, 有多个抽象方式就好报错;使用函数式接口,所以使用lambda表达式时,编译器可以根据上下文找到对应的接口,方法, 确定参数类型. 函数式接口示例
@FunctionalInterface
public interface MyFunctionInterface {
/**
* 抽象方法
*/
void sayHello();
/**
* 函数接口可以有默认实现
*/
default void speakEnglish() {
System.out.println("hello everybody !");
}
}
java8有四大函数接口
1.消费型接口Consumer,有参数无返回值
@Test
public void testConsumer() {
/**
* @name消费型接口
* @use Consumer<T>
* @Param T 传入参数
* @fun 接受一个参数, 无返回值
*/
Consumer<String> con = (x) -> {
System.out.println("我消费了一个:" + x);
};
con.accept("苹果");
}
2.供应式接口Supplier,无参数有返回值
@Test
public void testSupplier() {
/**
* @name 供应式接口
* @use Supplier<R>
* @Param R返回值类型
* @fun 无参数, 有返回值
*/
Supplier<Date> supplier = () -> new Date();
Date date = supplier.get();
System.out.println("获得了一个供应的日期:" + date);
}
3.函数接口Function,有参数,有返回值
/**
* @param T 传入参数
* @return R 返回参数
* @name函数型接口
* @use Function<T , R>
* @fun 接收一个参数, 有返回值
*/
@Test
public void testFunction() {
Function<String, String> fun = (str) -> "hello," + str;
String tom = fun.apply("Tom");
System.out.println(tom);
}
4.断定型接口Predicate,接受一个参数,返回布尔值
/**
* @param T 入参
* @return Boolean 返回一个Boolean值
* @name 断定型接口
* @use Predicate<T>
* @fun 接收一个参数, 返回一个Boolean值
*/
@Test
public void testPredicate() {
Predicate<Integer> predicate = (num) -> num > 0;
System.out.println(predicate.test(5));
}