什么是函数式接口
- 只包含一个抽象方法的接口,称为函数式接口。
- 你可以通过Lambda表达式来创建该接口的对象。( 若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
- 我们可以在一个接口上使用@Functionallnterface注解,这样做可以检查它是否是一个函数式接口。同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
- 在java.util.function包下定义了Java 8的丰富的函数式接口
方法引用
- 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
- 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lalmbda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
- 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的
方法的参数列表和返回值类型保持一致! - 格式:使用操作符“:” 将类(或对象)与方法名分隔开来。
如下三种主要使用情况:
➢对象::实例方法名
➢类::静态方法名
➢类::实例方法名
// 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
// 2.方法引用,本质上就是Lambda表达式, 而Lambda表达式作为函数式接口的实例。
// 所以方法引用, 也是函数式接口的实例。
// 3.使用格式: 类(或对象) ::方法名
// 4.具体分为如下的三种情况:
// 对象::非静态方法
// 类::静态方法
// 类::非静态方法!!!
// 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!(针对前两种情况)
package JAVA8.Lambda_;
import org.junit.jupiter.api.Test;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;
public class LambdaStudy03 {
// 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
// 2.方法引用,本质上就是Lambda表达式, 而Lambda表达式作为函数式接口的实例。
// 所以方法引用, 也是函数式接口的实例。
// 3.使用格式: 类(或对象) ::方法名
// 4.具体分为如下的三种情况:
// 对象::非静态方法
// 类::静态方法
// 类::非静态方法!!!
// 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!(针对前两种情况)
//情况一:对象::实例方法 Consumer的void accept(T t)和PrintStream中的void println(T t)
@Test
public void test01(){
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("Beijing");
//方法引用
PrintStream ps = System.out;
Consumer<String> consumer1 = ps::println;
consumer1.accept("Shanghai");
}
//情况二:类::静态方法 Comparator 中的int compare(T t1,T t2) Integer中的int compare(T t1,T t2)
@Test
public void test02(){
Comparator<Integer> comparator = (t1,t2) -> Integer.compare(t1,t2);
System.out.println(comparator.compare(12,21));
//方法引用
Comparator<Integer> comparator1 = Integer::compare;
comparator1.compare(12,21);
}
//情况三:类::非静态方法(难) Comparator中的int comapre( T t1,T t2) String中的int t1.compareTo(t2)
@Test
public void test03(){
Comparator<String> comparator = (s1,s2) -> s1.compareTo(s2);
System.out.println(comparator.compare("abc","bcd"));
Comparator<String> comparator1 = String::compareTo; //当第一个参数做为第二个参数的调用者时也可以使用
}
}
构造器引用和数组引用
package JAVA8.Lambda_;
import SE1.Array;
import org.junit.jupiter.api.Test;
import src.Homework.Employee;
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier;
public class LambdaTest04 {
@Test
public void test01(){
Supplier<Employee> supplier = ()-> new Employee(); //构造器Lambda
System.out.println(supplier.get());
Supplier<Employee> supplier1 = Employee::new; //构造器引用
System.out.println(supplier1.get());
}
@Test
public void test02(){
Function<Integer,String[]> function = length -> new String[length]; //数组Lambda
String []arr1 = function.apply(5);
System.out.println(Arrays.toString(arr1));
Function<Integer,String[]> function1 = String[]::new; //数组引用
String[] apply = function1.apply(8);
System.out.println(Arrays.toString(apply));
}
}