java8 lambda 视频_一文搞懂Java8 Lambda表达式(附带视频教程)
Lambda表達式介紹
Java 8的一個大亮點是引入Lambda表達式,使用它設計的代碼會更加簡潔。通過Lambda表達式,可以替代我們以前經常寫的匿名內部類來實現接口。Lambda表達式本質是一個匿名函數;
體驗Lambda表達式
我們通過一個小例子來體驗下Lambda表達式;
我們定義一個計算接口 只有一個方法add;
public classProgram {public static voidmain(String[] args) {
Cal c1=newCal() {
@Overridepublic int add(int a, intb) {return a+b;
}
};int c=c1.add(1,2);
System.out.println(c);
}
}interfaceCal{int add(int a,intb);
}
這個是我們以前的實現,匿名內部類,然后調用執行;
我們現在用Lambda表達式改寫下:
public classProgram {public static voidmain(String[] args) {
Cal c1=(int a,int b) ->{return a+b;};int c=c1.add(1,2);
System.out.println(c);
}int add(int a,intb){return a+b;
}
}interfaceCal{int add(int a,intb);
}
匿名內部類,直接改成了:
Cal c1=(int a,int b) ->{return a+b;};
簡潔多了;
是不是感覺Lambda表達式挺強大,
接下來我們來看看Lambda表達式的語法吧;
Lambda表達式語法
我們看下這個Lambda表達式:
(int a,int b) ->{return a+b;};
這個本質是一個函數;
一般的函數類似如下:
int add(int a,intb){return a+b;
}
有返回值,方法名,參數列表,方法體
Lambda表達式函數的話,只有參數列表,和方法體;
( 參數列表 ) -> { 方法體 }
說明:
( ) :用來描述參數列表;
{ } : 用來描述方法體;
->? :Lambda運算符,可以叫做箭頭符號,或者goes to
Lambda表達式語法細講
我們搞一個案例,接口方法參數,無參,單個參數,兩個參數,有返回值,沒有返回值,這六種情況都羅列下:
interfaceIf1{/**
* 無參數無返回值*/
voidtest();
}interfaceIf2{/**
* 單個參數無返回值
* @param a*/
void test(inta);
}interfaceIf3{/**
* 兩個參數無返回值
* @param a
* @param b*/
void test(int a,intb);
}interfaceIf4{/**
* 無參數有返回值
* @return*/
inttest();
}interfaceIf5{/**
* 單個參數有返回值
* @param a
* @return*/
int test(inta);
}interfaceIf6{/**
* 多個參數有返回值
* @param a
* @param b
* @return*/
int test(int a,intb);
}
我們用Lambda表達式實現:
//無參數無返回值
If1 if1=()->{
System.out.println("無參數無返回值");
};
if1.test();//單個參數無返回值
If2 if2=(int a)->{
System.out.println("單個參數無返回值 a="+a);
};
if2.test(3);//兩個參數無返回值
If3 if3=(int a,int b)->{
System.out.println("兩個參數無返回值 a+b="+(a+b));
};
if3.test(2,3);//無參數有返回值
If4 if4=()->{
System.out.print("無參數有返回值");return 100;
};
System.out.println(if4.test());//單個參數有返回值
If5 if5=(int a)->{
System.out.print("單個參數有返回值");returna;
};
System.out.println(if5.test(200));//多個參數有返回值
If6 if6=(int a,int b)->{
System.out.print("多個參數有返回值");return a+b;
};
System.out.println(if6.test(1,2));
運行輸出:
無參數無返回值
單個參數無返回值 a=3兩個參數無返回值 a+b=5無參數有返回值100單個參數有返回值200多個參數有返回值3
Lambda表達式精簡語法
那件語法注意點:
參數類型可以省略
假如只有一個參數,()括號可以省略
如果方法體只有一條語句,{}大括號可以省略
如果方法體中唯一的語句是return返回語句,那省略大括號的同事return也要省略
改寫實例:
/**
* @author java1234_小鋒
* @site www.java1234.com
* @company Java知識分享網
* @create 2020-08-12 16:43*/
public classProgram2 {public static voidmain(String[] args) {//1,參數類型可以省略//2,假如只有一個參數,()括號可以省略//3,如果方法體只有一條語句,{}大括號可以省略//4,如果方法體中唯一的語句是return返回語句,那省略大括號的同事return也要省略//無參數無返回值
If1 if1=()->System.out.println("無參數無返回值");
if1.test();//單個參數無返回值
If2 if2=a->System.out.println("單個參數無返回值 a="+a);
if2.test(3);//兩個參數無返回值
If3 if3=(a,b)->{
System.out.println("兩個參數無返回值 a+b="+(a+b));
};
if3.test(2,3);//無參數有返回值
If4 if4=()->100;
System.out.println(if4.test());//單個參數有返回值
If5 if5=a->{
System.out.print("單個參數有返回值");returna;
};
System.out.println(if5.test(200));//多個參數有返回值 參數類型可以省略
If6 if6=(a,b)->a+b;
System.out.println(if6.test(1,2));
}
}
方法引用
有時候多個lambda表達式實現函數是一樣的話,我們可以封裝成通用方法,以便于維護;
這時候可以用方法引用實現:
語法是:對象::方法
假如是static方法,可以直接 類名::方法
實例如下:
public classProgram2 {public static voidmain(String[] args) {//方法引用//語法://static方法 類名::方法名//普通方法 對象名::方法名
Program2 program2=newProgram2();
If5 if5=program2::test;
If5 if52=Program2::test2;
System.out.println(if5.test(1));
System.out.println(if52.test(1));
}public int test(inta){return a-2;
}public static int test2(inta){return a-2;
}
}
構造方法引用
如果函數式接口的實現恰好可以通過調用一個類的構造方法來實現,
那么就可以使用構造方法引用;
語法:類名::new
實例:
先定義一個Dog實體,實現無參和有參構造方法;
public classDog {privateString name;private intage;publicDog() {
System.out.println("無參構造方法");
}public Dog(String name, intage) {
System.out.println("有參構造方法");this.name =name;this.age =age;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}
@OverridepublicString toString() {return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在定義兩個接口:
interfaceDogService{
Dog getDog();
}interfaceDogService2{
Dog getDog(String name,intage);
}
測試:
public classProgram3 {public static voidmain(String[] args) {//普通方式
DogService dogService=()->{return newDog();
};
dogService.getDog();//簡化方式
DogService dogService2=()->newDog();
dogService2.getDog();//構造方法引用
DogService dogService3=Dog::new;
dogService3.getDog();//構造方法引用 有參
DogService2 dogService21=Dog::new;
dogService21.getDog("小米",11);
}
}
執行結果:
無參構造方法
無參構造方法
無參構造方法
有參構造方法
綜合實例
下面我們通過一個lambda操作集合的綜合實例,來深入體驗下Lambda表達式用法;
public classProgram4 {public static voidmain(String[] args) {
List list=new ArrayList<>();
list.add(new Dog("aa",1));
list.add(new Dog("bb",4));
list.add(new Dog("cc",3));
list.add(new Dog("dd",2));
list.add(new Dog("ee",5));//排序
System.out.println("lambda集合排序");
list.sort((o1,o2)->o1.getAge()-o2.getAge());
System.out.println(list);//遍歷集合
System.out.println("lambda遍歷集合");
list.forEach(System.out::println);
}
}
運行輸出:
lambda集合排序
[Dog{name='aa', age=1}, Dog{name='dd', age=2}, Dog{name='cc', age=3}, Dog{name='bb', age=4}, Dog{name='ee', age=5}]
lambda遍歷集合
Dog{name='aa', age=1}
Dog{name='dd', age=2}
Dog{name='cc', age=3}
Dog{name='bb', age=4}
Dog{name='ee', age=5}
我們來分析下集合的sort方法,
sort方法里有一個Comparator接口,再點進去看下:
我們通過lambda就可以輕松實現排序:
(o1,o2)->o1.getAge()-o2.getAge()
再看下集合的forEach方法,點進去:
有個消費者Consumer接口,再點進去:
接口里有個接口參數的accept的方法;
所以我們直接方法引用 直接輸出每次的遍歷值即可;
System.out::println
@FunctionalInterface注解
前面我們會發現Consumer接口,Comparator接口都有
@FunctionalInterface注解;
這個注解是函數式接口注解,所謂的函數式接口,當然首先是一個接口,然后就是在這個接口里面只能有一個抽象方法。
這種類型的接口也稱為SAM接口,即Single Abstract Method interfaces
特點
接口有且僅有一個抽象方法
允許定義靜態方法
允許定義默認方法
允許java.lang.Object中的public方法
該注解不是必須的,如果一個接口符合"函數式接口"定義,那么加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進行檢查。如果編寫的不是函數式接口,但是加上了@FunctionInterface,那么編譯器會報錯
實例
//正確的函數式接口
@FunctionalInterfacepublic interfaceTestInterface {//抽象方法
public voidsub();//java.lang.Object中的public方法
publicboolean equals(Object var1);//默認方法
public default voiddefaultMethod(){
}//靜態方法
public static voidstaticMethod(){
}
}//錯誤的函數式接口(有多個抽象方法)
@FunctionalInterfacepublic interfaceTestInterface2 {voidadd();voidsub();
}
系統內置函數式接口
Java8的推出,是以Lambda重要特性,一起推出的,其中系統內置了一系列函數式接口;
再jdk的java.util.function包下,有一系列的內置函數式接口:
比如常用的Consumer,Comparator,Predicate,Supplier等;
Lambda表達式視頻教程
感謝各位兄弟姐妹關注,鋒哥為了大伙能更深刻的掌握Lambda的原理和應用,專門錄制了一期視頻教程。主要以IDEA開發工具,來講解lambda表達式,希望小伙伴們快速的掌握。
紙上得來終覺淺,絕知此事要躬行。
需要多實戰,多思考
------------------------------------------------------------------------------------------------------------------------------
作者:java1234_小鋒
版權:本站使用「CC BY 4.0」創作共享協議,轉載請在文章明顯位置注明作者及出處。
------------------------------------------------------------------------------------------------------------------------------
總結
以上是生活随笔為你收集整理的java8 lambda 视频_一文搞懂Java8 Lambda表达式(附带视频教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么计算python程序执行时间_【华为
- 下一篇: java datainputstream