函数式接口:
1.概述: 函数式接口在Java中是指有且仅有一个抽象方法的接口
2.格式:
修饰符 interface 接口名称 {
// 定义一个抽象方法
public abstract 返回值类型 方法名称(可选参数信息);
// 其他非抽象方法内容
}
3.特点:
3.1 可以使用Lambda表达式来表示函数式接口的对象
3.2 函数式接口可以使用@FunctionalInterface注解来标识,如果不是函数式接口,就不能使用该注解来标识
方法引用:
下面两种写法,完全等效:
-
Lambda表达式写法:
s -> System.out.println(s);
-
方法引用写法:
System.out::println
1.格式 使用::冒号把方法直接引过来
通过对象引用成员方法: 对象名::方法名
通过类名引用静态方法: 类名::静态方法名
通过super引用父类的方法: super::父类的方法名
通过this引用本类的成员方法: this::本类的方法名
类的构造引用: 类名::new
数组的构造引用: 数组类型::new
2.什么情况下可以使用方法引用替换Lambda表达式
如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者
简而言之:就是Lambda的解决方案就是调用一个已经存在的方法,那么这个时候就可以使用方法引用替换Lmabda表达式
3.可推导可省略
如果使用方法引用,也是同样可以根据上下文进行推导。
Supplier接口:
java.util.function.Supplier<T>接口仅包含一个无参的方法:T get() 用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。
Consumer接口:
1.java.util.function.Consumer<T>接口则正好相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。只进不出
2.抽象方法:accept
Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。
3.默认方法 andThen: 其实就是消费2次
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);// 判断after对象是否为null
return (T t) -> { accept(t); after.accept(t); };
}