01.了解Lambda表达式
本质:作为函数式接口的实例(可以简化代码,具体看案例)
语法格式
(函数的参数列表)->{函数体}
具体案例如下:
//创建Runnable对象,()为参数的参数列表,没有任何参数
Runnable r=()-> {//函数的参数体
System.out.println("哈哈哈哈哈哈");
System.out.println("==================");
};
上述代码中不使用Lambda表达式的写法如下:
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("哈哈哈哈哈哈");
System.out.println("==================");
}
};
使用前提:函数式接口
函数式接口:一个接口中,如果接口只声明了一个抽象方法,则称接口为函数式接口
具体案例如下
@FunctionalInterface //可以检验是否为函数式接口
public interface Supplier<T> {
T get();
}
Java内置4大函数式接口(java.util.function)
接口 | 方法 | 作用 |
---|---|---|
Consumer | void accept(T t) | 对类型为T的对象应用操作 |
Supplier | T get() | 返回类型为T的对象 |
Function<T, R> | R apply(T t) | 对类型为T的对象应用操作,并返回结果。结果是R类型的对象 |
Predicate | boolean test(T t) | 确定类型为T的对象是否满足某约束,并返回boolean 值 |
02.具体案例
定义一个数组,对数组从大到小进行排序
- 写法1
Integer[] arr={9,3,5,6,7,10086,-5};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
- 写法2:Lambda表达式简化1(写法1简化)
Integer[] arr={9,3,5,6,7,10086,-5};
Arrays.sort(arr,(Integer o1, Integer o2)->{ return o2-o1;});
- 写法3:Lambda表达式简化2(写法2简化)
参数列表中,参数类型可以省略,具体如下:
Integer[] arr={9,3,5,6,7,10086,-5};
//这里省略了参数列表的参数类型
Arrays.sort(arr,(o1, o2)->{ return o2-o1;});
- 写法3:Lambda表达式简化3(写法2简化)
如果函数体只有一行代码,则可以省略’{}',具体如下:
Integer[] arr={9,3,5,6,7,10086,-5};
//如果有返回值,则return也要省略掉
Arrays.sort(arr,(o1, o2)-> o2-o1);
补充:如果参数列表中参数个数只有一个,则可以省略’()',具体案例如下:
Consumer<String> con=new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println("哈哈哈哈");
}
};
可以简写为
//参数只有一个,小括号可以省略
Consumer<String> c=s -> System.out.println(s);