lambda表达式
一个匿名函数,一段可像数据一样传递的代码,写出更简洁、更灵活、更紧凑的代码,使Java的语言表达能力得到提升。语法糖。
Java8中引入了一个新的操作符“->”,箭头操作符或lambda操作符
表达式拆分成两部分
左侧:lambda 表达式的参数列表
右侧:lambda表达式中所需要执行的功能
原来是匿名内部类,现在是抽象方法的实现
函数式接口:
Lambda表达式,需要函数式接口的支持,
即接口中只有一个抽象方法的接口
可以使用@FunctionalInterface修饰,可以检查是否为函数式接口
- 语法格式一:无参数,无返回值
() -> System.out.println(“Lambda”);
Jdk1.7版本,局部内部类使用了局部变量,变量必须是final
jdk1.8版本不用加,已经设置成final
- 语法格式二:有一个参数,无返回值
Consumer<String> com = (s) -> System.out.println(s);
com.accept("Lambda");
- 语法格式三:若只有一个参数,小括号可以不写
Consumer<String> com = s -> System.out.println(s);
com.accept("Lambda");
- 有两个以上参数,有返回值,并且Lambda体中有多条语句,必须使用大括号
Consumer<String> com = (x,y) -> { System.out.println("Lambda");
return Integer.compare(x,y);
};
- 语法格式五:若lambda体中只有一条语句,return和大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
-
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型判断”
(Integer x,Integer y) -> Integer.compare(x,y);
-
左侧一个参数可以省略(),右侧一个语句可以省略{}
左侧有数据类型,右侧可以省
Java8内置的四大核心函数式接口
-
Consumer:消费型接口 void accept(T t)无返回值,直接执行的方法
-
Supplier:供给型接口 T get();无参,用于产生一些数据的方法
-
Fuction<T,R>:函数型接口 R apply(T t)传T返回R
-
Predicate:断言型接口 Boolean test(T t)传T返回Boolean
-
其他接口:
BiFunction<T,U,R> 两个参数,一个返回值
UnaryOperator(Function子接口) ,对T类型对象,进行一元运算并返回T类型结果,包含方法为: T apply(T t)
BiaryOperator(BiFunction子接口) ,两个同类型参数,对T类型对象,进行二元运算并返回T类型结果,包含方法为: T apply(T t1,T t2)
BiConsumer<T,U>,对类型T,U进行操作,包含方法为: T apply(T t1,U u1)
方法引用和构造器引用
方法引用:若Lambda体中的内容方法已经实现了,我们可以使用方法引用。
方法引用是Lambda表达式的另外一种表现形式
注意: Lambda 体中,调用方法的参数列表与返回值类型,
要与函数式接口中抽象方法的参数列表和返回值类型保持一致
主要有三种语法格式:
- 对象::实例方法名,
- 类::静态方法名
/**@Description 类::静态方法名 */
@Testpublic void testThree() {
Comparator<Integer> com =(x,y)->Integer.compare(x,y);
//相同方法,后续可以 :: 直接使用
Comparator<Integer> com1 =Integer::compareTo;}
- 类::实例方法名
当Lambda 参数列表中的第一参数 是实例方法的调用者,而第二个参数是实例方法的 使用参数时,可以使用 ClassName::methed
构造器引用
格式:ClassName ::new
注意:不传参数就无参构造器,传什么参数就什么类型参数的构造器
需要调用的构造器的参数列表,要与函数式接口中的抽象方法的参数列表保持一致
Supplier<Employee> emp = () -> new Employee();
//**构造器引用**
//函数式接口的,抽象方法的参数列表,自动匹配构造器,Supplier.get()方法无参数
Supplier<Employee> emp2 = Employee::new;
//自动构造无参方法
Employee employee =emp2.get();
System.out.println("employee = " + employee);
Function<Integer, Employee> func = x -> new Employee();
//**构造器引用**
//有参构造
Function<Integer, Employee> emp2 = Employee::new;
Employee employee = emp2.apply(101);
System.out.println("employee = " + employee);
//两个参数进行构造
BiFunction<Integer, Integer, Employee> bif =Employee::new;
数组引用
Type::new
Function<Integer, String[]> func = x -> new String[x];
String[] apply = func.apply(10);
System.out.println("apply = " + apply.length);
Function<Integer,String[]> func2 =String[]::new;
String[] apply1 = func2.apply(20);
System.out.println("apply1 = " + apply1.length);