package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
2、断言性接口:Predicate
主要用到test方法 其中参数t为输入参数,如果输入参数符合断言则返回true,否则false
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
3、供给性接口:Supplier
不接收任何参数 但有返回值
@FunctionalInterface
public interface Supplier<T> {
T get();
}
4、消费性接口:Consumer
只接收一个参数t,但是没有返回值。
五、Lambda表达式
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。
JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。
简单明了,函数式接口就是为了Lambda 表达式而生的。
六、Lambda表达式的推导过程
1、匿名内部类 --> Lambda表达式 --> 简化Lambda表达式
package java8.lamda;
public class LamdaTest {
public static void main(String[] args) {
//匿名内部类
IStudent student = new IStudent() {
@Override
public void study(String technology,int time) {
System.out.println("匿名内部类,"+technology+time);
}
};
student.study("java",8);
//Lambda表达式改造(将类名和方法名去掉)
IStudent student1 = (String technology,int time)->{
System.out.println("Lambda表达式改造(将类名和方法名去掉)"+technology+time);
};
student1.study("java",8);
//一级进化(去掉数据类型)
IStudent student2 = ((technology, time) -> {
System.out.println("一级进化(去掉数据类型)"+technology+time);