Lambda简介
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。
一、对接口的要求
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法
。
二、@FunctionalInterface
修饰函数式接口的,要求接口中的抽象方法只有一个。 这个注解往往会和 lambda 表达式一起出现。
三、Lambda 基础语法
语法形式为 () -> {},其中 () 用来描述参数列表,-> 为 lambda运算符 ,{} 用来描述方法体。
/**无参无返回值*/
@FunctionalInterface
public interface NoReturnNoParam {
void method();
}
/**多个参数有返回值*/
@FunctionalInterface
public interface ReturnMultiParam {
int method(int a, int b);
}
public class Test {
public static void main(String[] args) {
//无参无返回
NoReturnNoParam noReturnNoParam = () -> {
System.out.println("NoReturnNoParam");
};
noReturnNoParam.method();
//多个参数有返回值
ReturnMultiParam returnMultiParam = (int a, int b) -> {
System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}");
return 1;
};
int res3 = returnMultiParam.method(6, 8);
System.out.println("return:" + res3);
}
}
四、Lambda 语法简化
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
// 给list添加元素
Collections.addAll(list, 7, 324, 89, 21, 54, 8, 44);
System.out.println(list);// [7, 324, 89, 21, 54, 8, 44]
// 实现Comparator接口进行升序排序
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println(list);// [7, 8, 21, 44, 54, 89, 324]
/**
* 系统完全可以推断出sort方法的形参是Comparator接口比较器,
* 系统也完全可以推断出Comparator接口有一个compare抽象方法需要重写,
* 把系统能够推断出来的省略,在方法参数与方法体中间使用一个箭头连接,这就是Lambda表达式。
* Lambda表达式可以看作一个匿名方法,没有方法名,只有参数列表与方法体。
*/
list.sort((Integer o1, Integer o2) -> {
return o2.compareTo(o1);
});
System.out.println(list);// [324, 89, 54, 44, 21, 8, 7]
ArrayList<Student> arrayList = new ArrayList<>();
arrayList.add(new Student("lisi",20,90));
arrayList.add(new Student("wangwu",40,80));
arrayList.add(new Student("zhaoliu",40,40));
// 删除
arrayList.removeIf(ele -> ele.getName().equals("lisi"));
System.out.println(arrayList);// [Student{name='wangwu', age=40, score=80}, Student{name='zhaoliu', age=40, score=40}]
/**
* Lambda表达式的语法:
* (参数列表)-> {方法体}
* 1)参数列表中参数类型可以省略
* 2)如果参数列表中只有一个参数,小括号也可以省略
* 3)如果Lambda体中只有一条语句,大括号也可以省略,这一条语句如果是返回语句,return也可以省略
* Lambda表达式作用:
* 可以使代码更简洁
*/
list.sort((o1, o2) -> o1.compareTo(o2));
System.out.println(list);// [7, 8, 21, 44, 54, 89, 324]
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
// 简写后的Lambda表达式
list.forEach(integer -> System.out.println(integer));
// Lambda表达式引用方法(方法引用):方法归属者::方法名 静态方法的归属者为类名,普通方法归属者为对象
list.forEach(System.out ::println);
Map<String,Integer> map = new HashMap<>();
map.put("lisi",5000);
map.put("wangwu",9000);
map.put("zhaoliu",2000);
map.put("chenqi",7000);
map.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String s, Integer integer) {
System.out.println(s + ":" + integer);
}
});
// 简写后的Lambda表达式
map.forEach((k,v) -> System.out.println(k + ":" + v));
Set<String> keySet = map.keySet();
// 转成流对象,过滤要求长度大于4,升序排序,进行遍历
keySet.stream().filter(x -> x.length() > 4).sorted(String::compareTo).forEach(System.out::println);
}
}