1.Lambada使用場景
- lambda表達式中只能爲函數式接口創建實例
補充:
什麼是函數式接口?
函數式接口是只包含一個抽象方法聲明的接口.java.lang.Runnable 就是一種函數式接口,在 Runnable 接口中只聲明瞭一個方法 void run(),相似地,ActionListener 接口也是一種函數式接口,我們使用匿名內部類來實例化函數式接口的對象,有了 Lambda 表達式,這一方式可以得到簡化。
2. Lambda表達式與匿名內部類的聯繫和區別
聯繫:
- lambda表達式創建的對象與匿名內部類生成的對象一樣,可以直接調用接口中繼承的默認方法。
區別:
-
匿名內部類可以爲任意接口創建實例,不管接口中包含多少個抽象方法,只要在匿名內部類中實現所有抽象方法即可。 但在lambda表達式中只能爲函數式接口創建實例。
-
匿名內部類可以爲抽象類甚至普通類創建實例;但lambda表達式只能爲函數式接口創建實例。
-
匿名內部類實現的抽象方法可以允許調用接口中定義默認方法。但lambda表達式的代碼塊不允許調用接口中定義默認方法。
4. 常見的函數式接口
4.1 Runnable
Runnable runnable = ()->{
System.out.println(Thread.currentThread().getName());
};
Thread thread = new Thread(runnable);
thread.start();
- Runnable只有一個run函數,且run函數沒有參數
4.2 Consumer接口
Consumer接口接收一個參數,不返回參數
public static void consumerFun(int value, Consumer<Integer> c) {
c.accept(value);
}
//調用
consumerFun(1,(value)->{
System.out.println(value);
});
4.3 BinConsumer接口
與Consumer接口一樣,只不過接收兩個參數,返回0個參數
public static void binConsumerFun(String a, String b, BiConsumer<String, String> binc) {
binc.accept(a, b);
}
//調用
binConsumerFun("hello", "maskwang", (a,b)->{
System.out.println(a+b)
});
4.4 Predication
作用接收一個參數,返回一個boolean值
public static boolean predicateFun(int value, Predicate<Integer> pre) {
return pre.test(value);
}
//調用
System.out.println(predicateFun(3, x->x==3));
4.5 Supplier
作用是接收0個參數,返回一個值
public static int supplierFun(Supplier<Integer> supplier) {
return supplier.get();
}
//調用
System.out.println(supplierFun(()->1));
4.5 Comparator
lambada表達式實現Comparator
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.sort((a,b) -> {return a>b?-1:1;});
//另一種方式
list.forEach(System.out::println)
4.6 集合的操作
實現集合的遍歷
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.forEach((value)->System.out.println(value));