1.什么是Lambda表達式
函數(shù)式編程
函數(shù)式編程思想盡量忽略面向?qū)ο蟮膹?fù)雜語法, 強調(diào)做什么, 而不是以什么開式做; 例如線程執(zhí)行任務(wù), 使用函數(shù)式思想, 就可以通過傳遞一段任務(wù)代碼給線程對象執(zhí)行, 而不需要創(chuàng)建任務(wù)對象;
Lambda表達式一方面是函數(shù)式編程, 別一方面是可以 簡化代碼;
2.Lambda表達式的使用前提與場景
- 當且僅當, 一個接口, 只有一個抽象函數(shù), 那么可以使用Lambda表達式來替換實現(xiàn)類對象
- 如果一個接口中只有一個抽象函數(shù), 那么這個接口叫做函數(shù)式接口;
- @FunctionalInterface 這個注解就表示這個接口是一個函數(shù)式接口;
- Lambda表達式大括號中的代碼是當調(diào)用該接口的抽象方法時, 才會執(zhí)行;
3.Lambda表達式的標準格式
(參數(shù)類型 參數(shù)名, 參數(shù)類型 參數(shù)名,...)->{代碼}
示例代碼一:
new Thread(()->{System.out.println("run()方法中的內(nèi)容");}).start();
示例代碼二
ArrayList<Integer> list = new ArrayList<>();
list.add(500);
list.add(300);
list.add(100);
list.add(400);
list.add(200);
Collections.sort(list,(Integer a,Integer b)->{ return b - a;});
4.Lambda表達式的省略格式
- 小括號中參數(shù)類型可以省略;
- 小括號中有且僅有一個參數(shù), 那么參數(shù)類型和小括號可以一起省略;
- 如果大括號中有且僅有一行代碼, 那么無論是否有返回值, 大括號, return, 分號都可以一起省略;
示例代碼一:
new Thread(()-> System.out.println("run方法中的內(nèi)容")).start();
示例代碼二:
ArrayList<Integer> list = new ArrayList<>();
list.add(500);
list.add(300);
list.add(100);
list.add(400);
list.add(200);
Collections.sort(list, (a, b) -> b - a);
5.Lambda的表現(xiàn)形式
-
變量的形式
Runnable runnable = ()-> System.out.println("變量的形式"); runnable.run();
-
參數(shù)的形式
// 參數(shù)的形式 Collections.sort(list, (str1, str2)-> str1.length() - str2.length());
-
返回值的形式
IA a = method4(); a.method(1000); public static IA method4(){ return a->{System.out.println("返回值形式"+a);}; } public interface IA { void method(int a); }
6.方法引用(Jdk1.8新特性)
6.1 什么是方法引用
方法引用就是用來在一定的情況下,替換Lambda表達式; 方法引用使用一對冒號 ::
6.2 方法引用的使用場景
- 如果一個Lambda表達式大括號中的代碼和另一個方法中的代碼一模一樣,那么就可以使用方法引用把該方法引過來,從而替換Lambda表達式
- 如果一個Lambda表達式大括號中的代碼就是調(diào)用另一方法,那么就可以使用方法引用把該方法引過來,從而替換Lambda表達式
public class Test {
public static void printStr(){
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
}
public static void main(String[] args) {
new Thread(()->{
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
System.out.println("jack");
}).start();
// run方法中的內(nèi)容,與printStr函數(shù)中的內(nèi)容一樣
// Lambda表達式寫法
new Thread(()->{Test.printStr();}).start();
// 替換Lambda表達式的寫法
new Thread(Test::printStr).start();
}
}
6.3 方法引用的分類
6.3.1 構(gòu)造方法引用
public class Person {
String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("楊紫");
list.add("迪麗熱巴");
list.add("陳鈺琪");
// 需求: 把流中的姓名元素,轉(zhuǎn)換成Person對象
//list.stream().map((String name)->{return new Person(name);}).forEach(p->
// System.out.println(p));
// 以上map方法中的Lambda 表達式,大括號中的代碼就是調(diào)用Person類的構(gòu)造方法
// 如何引用構(gòu)造方法: 類型::new
list.stream().map(Person::new).forEach(p-> System.out.println(p));
}
6.3.2 靜態(tài)方法引用
public static void main(String[] args) {
// 如何引用靜態(tài)方法: 類名::方法名
ArrayList<String> list = new ArrayList<>();
list.add("110");
list.add("111");
list.add("112");
// 需求:把集合中的元素轉(zhuǎn)換為int類型,打印輸出
// list.stream().map((String str)->{return Integer.parseInt(str);}).forEach(i-> System.out.println(i+1));
// 以上map方法中的Lambda表達式,大括號里就是調(diào)用Integer的靜態(tài)方法parseInt
list.stream().map(Integer::parseInt).forEach(i-> System.out.println(i+1));
}
6.3.3 對象成員方法引用
public static void main(String[] args) {
// 如何引用對象成員方法: 對象::成員方法名
// 注意: 這個方法一定是帶有參數(shù)的
ArrayList<String> list = new ArrayList<>();
list.add("楊紫");
list.add("迪麗熱巴");
list.add("陳鈺琪");
// 需求:把集合中所有元素打印輸出
// list.stream().forEach(name-> System.out.println(name));
// 以上forEach方法中的Lambda表達式,大括號中其實就是調(diào)用PrintStream的成員方法println()
list.stream().forEach(System.out::println);
}
6.3.4 類的成員方法引用
public static void main(String[] args) {
// 如何引用類的成員方法: 類名::成員方法名
// 注意:成員方法不帶參數(shù)的
ArrayList<String> list = new ArrayList<>();
list.add("楊紫");
list.add("迪麗熱巴");
list.add("陳鈺琪");
// 需求: 把集合中的元素轉(zhuǎn)換為該元素對應(yīng)的字符長度,打印輸出
// list.stream().map((String name)->{
// return name.length();}).forEach(System.out::println);
// 以上map方法中的Lambda表達式,大括號中就是調(diào)用String類對象的length()方法
list.stream().map(String::length).forEach(System.out::println);
}