留给自己忘记时快速回忆!
函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
可以用@FunctionalInterface注解表示一个函数式接口
函数式接口可以被隐式转换为 lambda 表达式。
其实就是一个函数约束,它的具体过程必须严格按照这个约束的入参出参来实现。
函数式接口的实例化
FunctionalInterface是一个函数式接口,如下(可以看到就是定义了一个入参String出参String的方法hello而已):
@FunctionalInterface
public interface FunctionalInterface {
public String hello(String name);
}
FunctionalInterface很多种实例化方式,实例化时便可以实现其具体的函数过程。以下是其中的两种:
1 用lamda实例化:
FunctionalInterface f = name -> "hello " + name;
用lamda实现了hello方法。
2 用::(方法引用)实例化:
::访问具体的类,将该类的方法赋值给左侧的函数式接口,即等号左侧是函数式接口实例,等号右侧是该实例的函数过程。
FunctionalInterface f = SomeClass::hello;
SomeClass如下:
public class SomeClass {
public static String hello(String name) {
return "hello " + name;
}
}
但需注意SomeClass的hello方法入参必须是String,出参必须是String,即与函数式接口的约束定义一致。
java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,所以一般也可以不自己写函数式接口,用它提供的类就可以了。
函数式接口可以被当做方法的参数
有一个方法如下:
public static <T, R> void call(T t, Function<T, R> f) {
System.out.println(f.apply(t));
}
可以看到该方法传入一个泛型T和一个函数式接口Function(java.util.function.Function<T, R>),然后打印函数式接口Function的apply结果,其apply具体的执行过程是由我们传入的Function<T, R> f的这个f实例定义的。如下:
FunctionalInterface f1 = SomeClass::hello;(SomeClass如上文定义)
FunctionalInterface f2 = name -> "bye " + name;
call("world", f1);
call("world", f2);
总结
自己感觉其实函数式接口本质思想还是java接口的那一套,只不过简化了很多。