一,lambda表达式
- 作用:用于简化匿名内部类
- 使用前提:匿名内部类实现的接口为函数式接口,也就是只有一个且只有一个必须被重写的抽象方法
- 检查:可以使用@FunctionalInterface来检查接口是否是函数式接口
- 语法结构:(要重写的方法的参数列表)->{要重写的抽象方法的方法体}
- 注意:lambda在使用时不会生成.class文件,而使用匿名内部类时会生产.class文件,所以lambda的效率更高
- 举例:
public class demo1 {
public static void main(String[] args){
/*没有使用lambda表达式
Motion motion = new Motion() {
@Override
public void move(String motion) {
System.out.println("我要"+motion);
}
};
*/
//正常使用
//Motion motion = (String str) -> { System.out.println("我要"+str); };
//当有参数列表时,可省略类型,当参数数量为一时,可以省略括号
//Motion motion = str -> { System.out.println("我要"+str); };
//当有参数列表时,可省略类型,当参数列表数量为一时,可以省略括号
//Motion motion = str -> { System.out.println("我要"+str); };
//当方法体只有一句时可以省略花括号,或者方法体为return语句,可以将花括号与return一起省略
//Motion motion = str -> System.out.println("我要"+str);
motion.move("跳");//我要跳
}
@FunctionalInterface
interface Motion{
void move(String motion);
}
}
二,函数式接口
- 概念:函数式接口在java中是指:有且仅有一个抽象方法的接口
- 作用:适用于函数式编程场景的接口,将接口的实例化对象作为参数传递
- 格式:
修饰符 interface 接口名称{
public abstract 返回值类型 方法名称(可选参数信息);
}
- 检测:可以使用@FunctionalInterface检查这个接口是否为函数式接口 5.举例:
//四大内置函数式接口 :
//Consumer<T> 消费型接口
//void accept(T t)
//用于一个参数没有返回值的方法实现,如List类的forEach方法,接收一个Consumer接口的实现类,forEach方法会在内部循环调用传入的接口实现类的accept方法
List<Integer> list = List.of(1,2,3,4,5);
list.forEach((i)->System.out.println(i));
//Function<T,R> 函数型接口
//R apply(T t)
//用于一个参数一个返回值的方法实现
public static String strHandler(String str, Function<String,String> func){
return func.apply(str);
}
System.out.println(strHandler("xixihaha",s->s.toUpperCase()));//XIXIHAHA
//Predicate<T> 断言型接口
//boolean test(T t)
//用于一个参数一个返回值为boolean的方法实现
//Supplier<T> 供给型接口
//T get()
//用于没有参数一个返回值的方法实现
三,方法引用
- 概念:方法引用就是用来直接访问已经存在的类或者类的实例对象的方法或者构造方法
- 作用:用于在某些情况下简化lambda表达式
- 格式:
对象::成员方法
类名::静态方法
类名::成员方法
- 方法引用的要求:
-
- lambda体中的实现,是通过调用另外一个方法实现的
-
- 满足一下一条
- a) lambda体内部引用的方法的参数与返回值,与lambda表达式的相对应
- b) lambda体内部引用的方法返回值与lambda相对应,lambda表达式的第一个参数作为内部调用方法的对象存在,后续参数与内部方法的参数对应
- 举例:
List<Integer> list = List.of(1,2,3,4,5);
//对象::成员方法
list.forEach((i)->System.out.println(i));
//分析 : 1)lambda体{}中的实现,是通过调用另外一个方法实现的 √println 2) a-->√ 成员方法通过 对象::成员方法名
list.forEach(System.out::println);
//类名::静态方法
BiFunction<Integer,Integer,Integer> fun1 = (x,y)->Math.max(x,y);
//分析 : 1)lambda体{}中的实现,是通过调用另外一个方法实现的 √ max 2) a-->√ 静态方法 类名::静态方法
fun1 = Math::max;
System.out.println(fun1.apply(3,5));
//类名::成员方法
BiPredicate<String,String> pre = (x,y) -> x.equals(y);
//分析 : 1)lambda体{}中的实现,是通过调用另外一个方法实现的 √ equals 2) b-->√ 类名::成员方法
pre = String::equals;
System.out.println(pre.test(new String("abc"),"abc"));