1. Lambda表达式
2. 函数式接口
3. 方法引用。
4. Stream流
5. 日期时间类
3、方法引用
特殊的lambda表达式,它是对lambda表达式的一种简写方式。
3.1、方法引用的由来
package demo07;
import java.util.function.Consumer;
public class Test07 {
public static void main(String[] args) {
Consumer<int[]> c=t->{
int sum = 0;
for (int a :t) {
sum+=a;
}
System.out.println("数组的和:"+sum);
};
fun(c);
}
public static void fun(Consumer<int[]> consumer){
int[] arr = {1,2,3,4,5};
consumer.accept(arr);
}
//求和方法
public static void sum(int[] arr){
int sum = 0;
for (int a :arr) {
sum+=a;
}
System.out.println("数组的和:"+sum);
}
}
如果我们在Lambda中所指定的功能,已经有其他方法存在相同方案,那是否还有必要再写重复逻辑?可以直接“引用”过去就好了:---方法引用。::
package demo07;
import java.util.function.Consumer;
public class Test07 {
public static void main(String[] args) {
// Consumer<int[]> c=t->{
// int sum = 0;
// for (int a :t) {
// sum+=a;
// }
// System.out.println("数组的和:"+sum);
// };
// fun(c);
Consumer<int[]> c=Test07::sum;
fun(c);
}
public static void fun(Consumer<int[]> consumer){
int[] arr = {1,2,3,4,5};
consumer.accept(arr);
}
//求和方法
public static void sum(int[] arr){
int sum = 0;
for (int a :arr) {
sum+=a;
}
System.out.println("数组的和:"+sum);
}
}
3.2、方法引用的类型
3.3、静态方法引用
(args)->类名.静态方法(args). 当lambda表达式中方法体,只有一条语句,而这条语句是类名.静态方法。而静态方法的参数和lambda的参数一致时。
类名::静态方法
Consumer<int[]> c=Test07::sum; //类名+类名中的静态方法
fun(c);
3.4、实例方法引用
(args) -> inst.instMethod(args)
实例方法引用,顾名思义就是调用已经存在的实例的方法,与静态方法引用不同的是类要先实例化,静态方法引用类无需实例化,直接用类名去调用
public static void main(String[] args) {
//创建一个类对象
Student student = new Student("张三",20);
//通过内置函数式接口,返回对象的名称
// Supplier<String> supplier=()->student.getName();
Supplier<String> supplier =student::getName;
String s = supplier.get();
System.out.println(s);
//观察:lambda表达式中有且仅有一条语句,方法调用语句 -----------实例方法引用特点:()->对象.普通方法();
}
3.5、对象方法引用
lambda: (inst,args)->inst.普通方法(args): -------->类名::普通方法
若Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的参数时,可以使用对象方法引用
package demo08;
import java.util.function.BiFunction;
public class Test09 {
public static void main(String[] args) {
// //判断两个字符串是否一致
// BiFunction<String,String,Boolean> biFunctionBiFunction =(t1,t2)->t1.equals(t2);
// Boolean apply = biFunctionBiFunction.apply("hello", "hello");
// System.out.println(apply);
//
//观察:符合对象方法引用
BiFunction<String,String,Boolean> biFunctionBiFunction =String::equals;
show(biFunctionBiFunction);
}
public static void show( BiFunction<String,String,Boolean> biFunctionBiFunction){
Boolean apply = biFunctionBiFunction.apply("hello", "hello");
System.out.println(apply);
}
}
3.6、构造方法引用
(args) -> new 类名(args)------构造方法引用: 类名::new
package demo08;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public class Test10 {
public static void main(String[] args) {
// Supplier<Student> supplier =()->new Student();
// Student student = supplier.get();
// System.out.println(student);
//观察:调用的构造函数
// Supplier<Student> supplier =Student::new; //无参构造
// Student student = supplier.get();
// System.out.println(student);
BiFunction<String,Integer,Student> biFunction=Student::new; //有参构造
Student apply = biFunction.apply("张三", 20);
System.out.println(apply);
}
}