java8 Lambda表達式的使用總結

簡介:
Lambda是一個匿名函數,我們可以把Lambda表達式理解為是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。使用它可以寫出更簡潔,更靈活的代碼。
案例:
話不多說,直接先看例子:
語法格式一:無參,無返回值
首先我們先在單元測試內寫出我們的原始代碼:
定義一個Run接口,里面只有一running(無參)方法
interface?Run{
??void?running();
}給出初始單元測試,實現Run接口的匿名實現類
@Test
??public?void?test01()?{
????Run runner=new?Run() {
??????@Override
??????public?void?running()?{
????????System.out.println("人類會跑步");
??????}
????};
????runner.running();
??}下面便是lambda表達式的使用(打印結果皆是一致):
使用lambda表達式時可寫成:
@Test
??public void test02() {
????Run runner=()->System.out.println("人類會跑步");
????runner.running();
??}語法格式二:有一參,無返回值
首先是接口:
interface?Run{
??void?running(String name);
}匿名實現類:
@Test
??public?void?test07()?{
????Run runner=new?Run() {
??????@Override
??????public?void?running(String name)?{
????????System.out.println(name+"能跑步");
??????}
????};
????runner.running("小邱");
??}lambda表達式:
@Test
??public void test08() {
????Run runner=(String name)->System.out.println(name+"能跑步");
????runner.running("小邱");
??}還可直接將數據類型省略,因為可以由編譯器推斷得出,稱為“類型推斷”
@Test
??public void test08() {
????Run runner=(name)->System.out.println(name+"能跑步");
????runner.running("小邱");
??}只有一個參數時,可省略小括號:
@Test
??public?void?test09() {
????Run runner=name->System.out.println(name+"能跑步");
????runner.running("小邱");
??}語法格式三:有兩參,無返回值
還是那個接口,在其方法中加入兩個參數
interface?Run{
??void?running(String name,int?distance);
}其原匿名實現類:
@Test
??public?void?test01()?{
????Run runner=new?Run() {
??????@Override
??????public?void?running(String name,int?distance)?{
????????System.out.println(name+"能跑"+distance+"公里");
??????}
????};
????runner.running("小邱",100);
??}使用lambda表達式:
@Test
??public?void?test06() {
????Run runner=(String name,int?distance)->System.out.println(name+"能跑"+distance+"公里");
????runner.running("小邱",100);
??}還可直接將數據類型省略,因為可以由編譯器推斷得出,稱為“類型推斷”
@Test
??public void test02() {
????Run runner=(name,distance)->System.out.println(name+"能跑"+distance+"公里");
????runner.running("小邱",100);
??}格式四:有兩參,有返回值
這里我們使用java中的Comparator接口來作為例子:
比較傳入的兩個數的大小
@Test
??public?void?test03()?{
????Comparator com1=new?Comparator() {
??????@Override
??????public?int?compare(Integer o1, Integer o2)?{
????????return?Integer.compare(o1, o2);
??????}
????};
????int?compare1=com1.compare(10, 20);
????System.out.println(compare1);
??} 按照格式二中的寫法便可以寫成:
@Test
??public?void?test04() {
????Comparator com1=(o1,o2)->Integer.compare(o1, o2);
????int?compare1=com1.compare(10, 20);
????System.out.println(compare1);
??} 如果用方法引用(調用類中靜態(tài)方法)的話就可以寫成:
@Test
??public?void?test05()?{
????Comparator com1=Integer::compare;
????int?compare1=com1.compare(10, 20);
????System.out.println(compare1);
??} 格式五:多參,多條語句
匿名實現類:
@Test
??public?void?test07() {
????Comparator com1=new?Comparator() {
??????@Override
??????public?int?compare(Integer o1, Integer o2) {
????????System.out.println(o1);
????????System.out.println(o2);
????????return?o1.compareTo(o2);
??????}
????};
??} lambda表達式:
@Test
??public?void?test08() {
????Comparator com1=(o1,o2)->{
??????System.out.println(o1);
??????System.out.println(o2);
??????return?o1.compareTo(o2);
????};
??} 總結:
1)舉例:(o1,o2)->Integer.compare(o1,o2);
2)格式:
“->”:lambda操作符 或 箭頭操作符
"->"左邊:lambda形參列表(就是接口中的抽象方法的形參列表)
"->"右邊:lambda體(就是重寫的抽象方法的方法體)3)
->左邊:lambda形參列表的參數類型可以省略(類型推斷):如果lambda形參列表只有一個參數,其小括號也可以省略。
->右邊:lambda體應該由一對{}包裹,如果lambda題只有一條執(zhí)行語句,那么可以省略{}4)lambda的本質:作為接口的實例。
原文鏈接:csdn.net/qq_45273552/article/details/109296786
評論
圖片
表情
