精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效開發!Lambda表達式和函數式接口最佳實踐

開發 前端
在 java.util.function 包中定義的函數式接口滿足了大多數開發者為 lambda 表達式和方法引用提供目標類型的需求。這些接口中的每一個都是通用且抽象的,這使得它們能夠輕松適應幾乎任何 lambda 表達式。

環境:Spring Boot 3.2.5

1. 簡介

Lambda表達式與函數式接口是Java 8引入的重要特性,它們極大地簡化了代碼編寫,提升了代碼的可讀性和簡潔性。Lambda表達式提供了一種簡潔的方式來表示匿名函數,而函數式接口則是一種只包含一個抽象方法的接口,非常適合與Lambda表達式結合使用。

在實際開發中,合理運用這些特性可以提高代碼的靈活性和復用性。最佳實踐中,推薦首先定義清晰且具有描述性的函數式接口,以增強代碼的可理解性;其次,在使用Lambda表達式時,盡量保持其簡短且功能單一,避免復雜的邏輯嵌套;此外,利用Stream API等函數式編程工具進行集合操作,能夠使代碼更加流暢、高效。通過遵循這些原則,開發者不僅能夠寫出更加優雅的代碼,還能更好地應對并發編程的需求,提升程序的整體性能。

接下來,我們將詳細研究函 數式接口 和 lambda 表達式。

2. 最佳實踐

2.1 優先使用標準的函數式接口

在 java.util.function 包中定義的函數式接口滿足了大多數開發者為 lambda 表達式和方法引用提供目標類型的需求。這些接口中的每一個都是通用且抽象的,這使得它們能夠輕松適應幾乎任何 lambda 表達式。我們在創建自定義的函數式接口之前,應該優先查看該包中的定義。

我們先來看下如下接口:

@FunctionalInterface
public interface Foo {


  String xxxooo(String string) ;
}

實用該接口:

public class UseFoo {
  public String pack(String param, Foo foo) {
    return foo.xxxooo(param) ;
  }
}

運行程序應該是如下方式:

Foo foo = param -> String.format("%s other info", param) ;
String ret = new UseFoo().pack("Message ", foo) ;

在這里的Foo接口方法簽名需要一個入參然后返回一個參數。而Java 8 已經在 java.util.function 包中提供了這樣的接口 Function<T, R>。所以我們沒有必要自己在定義,可以將上面的UseFoo修改如下:

public String pack(String param, Function<String, String> foo) {
  return foo.apply(param) ;
}
// 調用
Function<String, String> foo = param -> String.format("%s other info", param) ;

使用與之前定義的基本相同。

2.2 使用@FunctionalInterface注解

使用 @FunctionalInterface 注解接口。乍一看,這個注解似乎沒有什么用處。即使沒有它,只要接口中只有一個抽象方法,該接口也會被視為函數式接口。

然而,如果在一個大型項目中有多個接口;手動控制所有接口是很困難的。一個原本設計為函數式的接口可能會因為不小心添加了另一個抽象方法而被改變,從而使它不再是一個有效的函數式接口。

通過使用 @FunctionalInterface 注解,編譯器會在任何試圖破壞函數式接口預定義結構的行為時觸發錯誤。如下示例:

@FunctionalInterface
public interface Foo {
  String xxxooo(String param) ;
}

使用該接口,能防止你再定義其它方法。

2.3 不要在函數式接口中過渡使用默認方法

我們可以輕松地在函數式接口中添加默認方法。只要接口中只有一個抽象方法聲明,這樣做是符合函數式接口契約的:

@FunctionalInterface
public interface Foo {
  String xxxooo(String param);
  default void defaultMethod() {
    // ...
  }
}

如果它們的抽象方法具有相同的簽名,函數式接口可以被其他函數式接口繼承:

@FunctionalInterface
public interface Zoo extends Baz, Bar {}
  
@FunctionalInterface
public interface Baz {  
  String xxxooo(String param);  
  default String defaultBaz() {
    return "Baz..." ;
  }    
}
  
@FunctionalInterface
public interface Bar {  
  String xxxooo(String param);  
  default String defaultBar() {
    return "Bar..." ;
  }  
}
public static void main(String[] args) {
  Zoo zoo = param -> String.format("%s extends", param) ;
  System.out.println(zoo.xxxooo("Functional Interface")) ;
}

就像普通的接口一樣,如果不同的函數式接口繼承了具有相同默認方法的接口,這也可能會帶來問題。

修改上面的Baz和Bar接口,添加相同的默認方法:

@FunctionalInterface
public interface Baz { 
  default String print(){
    // ...
  }
}
@FunctionalInterface
public interface Bar { 
  default String print(){
    // ...
  }
}

這樣定義后,Zoo接口將編譯不通過,重復的默認方法錯誤。

我們可以通過如下方式,在Zoo接口重寫defaultCommon方法,如下示例:

@FunctionalInterface
public interface Zoo extends Baz, Bar {
  @Override
  default String print() {
    return Bar.super.print() ;
  }
}

所以,我們不應該在函數式接口中定義過多的默認方法。

2.4 使用 Lambda 表達式實例化功能接口

編譯器允許我們使用內部類來實例化函數式接口;然而,這樣做會導致代碼非常冗長。我們應該優先使用 lambda 表達式:

// 是使用上面定義的Zoo接口
Zoo zoo = param -> String.format("%s extends", param) ;
System.out.println(zoo.xxxooo("Functional Interface")) ;

如果是內部類定義那就太不優雅了。

Zoo zoo = new Zoo() {
  public String xxxooo(String param) {
    return String.format("%s extends", param) ;
  }
} ;

現在開發工具都能自動幫你將這里的內部類轉換為lambda表達式。

2.5 避免重載帶有函數式接口作為參數的方法

public interface Processor {
  String process(Callable<String> c) throws Exception;


  String process(Supplier<String> s);
}


public class ProcessorImpl implements Processor {
  public String process(Callable<String> c) throws Exception {
    return c.call() ;
  }
  public String process(Supplier<String> s) {
    return s.get() ;
  }
}

上面代碼看著沒撒毛病,但是你通過lambda表達傳參時,就出問題了:

ProcessorImpl process = new ProcessorImpl() ;
process.process(() -> "Pack") ;

Eclipse下提示

圖片圖片

模棱兩可的方法調用。解決辦法有2種:

  • 定義不同的方法名稱
  • 強制轉換
ProcessorImpl process = new ProcessorImpl() ;
process.process((Supplier<String>)() -> "Pack") ;

但是不推薦這種方式。

2.6 不要將 Lambda 表達式視為內部類

盡管在前面的例子中,我們基本上是用 Lambda 表達式替換了內部類,但這兩個概念在一個重要方面是不同的:作用域。

當我們使用內部類時,它會創建一個新的作用域。我們可以通過實例化具有相同名稱的新局部變量來隱藏外部作用域中的局部變量。我們還可以在內部類中使用 this 關鍵字作為對其自身實例的引用。

然而,Lambda 表達式則與外部作用域一起工作。我們不能在 Lambda 表達式的主體中隱藏外部作用域中的變量。在這種情況下,this 關鍵字是對外部實例的引用。

private String value = "Outer class value";


@FunctionalInterface
public interface Foo {
  String fn(String param);
}


public void xxoo() {
  Foo f = new Foo() {
    String value = "Inner class value";


    @Override
    public String fn(String param) {
      return this.value;
    }
  };
  String ret = f.fn("Pack") ;
  System.out.println(ret) ;
  Foo fl = param -> {
    String value = "Lambda value";
    return this.value;
  };
  ret = fl.fn("Pack");


  System.out.println(ret) ;
}

輸出結果:

Inner class value
Outer class value

根據運行結果得知,在Lambda中this.value方法的是類中定義的變量,而內部類訪問的則是當前內部類的變量。

2.7 避免在 Lambda 表達式的主體中使用代碼塊

Lambda 表達式應該用一行代碼來編寫。通過這種方式,Lambda 表達式成為一個自解釋的結構,聲明了應該對哪些數據執行什么操作。

如果我們有一大段代碼,那么 lambda 的功能就不會立即顯現出來。

Foo foo = param -> buildString(param) ;
private String buildString(String param) {
  String result = "Something " + param ;
  // ...
  return result ;
}

而不應該是如下代碼

Foo foo = param -> { 
  String result = "Something " + param ; 
  // ...
  return result ; 
} ;

注意:如果 lambda的定義有兩三行代碼,那么將代碼提取到另一個方法中也沒有什么價值,我們不應該將 "單行 lambda" 完全作為一個規約。

2.8 避免指定參數類型

在大多數情況下,編譯器可以通過類型推斷來確定 lambda 參數的類型。 因此,為參數添加類型是可選的,可以省略,如下實例:

BiFunction<String, String, String> fun = 
  (String a, String b) -> a.toLowerCase() + b.toLowerCase() ;

這里我們不用聲明類型,而是如下方式:

BiFunction<String, String, String> fun = 
  (a, b) -> a.toLowerCase() + b.toLowerCase() ;

這里完全可以通過類型推斷確定類型,所以沒有必要什么參數的類型。

2.9 單參數不要使用括號

Lambda 語法只要求在多個參數或沒有參數時使用括號。

錯誤示例

Function<String, String> fun = (a) -> a.toLowerCase() ;

正確示例

Function<String, String> fun = a -> a.toLowerCase() ;

只有一個參數時沒有必要添加括號

2.10 避免返回語句和括號

理想情況下,Lambda 表達式應該用一行代碼來編寫。通過這種方式,Lambda 表達式成為一個自解釋的結構,聲明了應該對哪些數據執行什么操作。

錯誤示例

Function<String, String> func = a -> {return a.toLowerCase()};

正確示例

Function<String, String> func = a -> a.toLowerCase() ;

這里我們沒有必要使用代碼塊,我們應該時刻注意盡可能的使得 Lambda 表達式只有一行。

2.11 方法引用

很多時候,即使在我們之前的示例中,lambda 表達式也只是調用其他地方已經實現的方法。 在這種情況下,使用 Java 8 的另一個特性--方法引用就非常有用了。

錯誤示例

Function<String, String> func = a -> a.toLowerCase();

正確示例

Function<String, String> func = String::toLowerCase;

如果你不懂方法引用,那么這種寫法是不是可讀性不好了?

2.12 使用"Effectively Final"變量

在 Lambda 表達式內部訪問 非final 變量會導致編譯時錯誤,但這并不意味著我們應該將每個目標變量都標記為 final。根據 "Effectively final" 的概念,只要變量僅被賦值一次,編譯器就會將其視為 final。

public void xxxooo() {
  String value = "Local" ; // 這里我們可以省去 final 修飾符
  Function<String, String> func = str -> {
    return value ;
  } ;
}

這里我們沒有必要在變量value前使用 final 修飾。但是我們不能在代碼塊中去修改,如下將無法編譯通過:

圖片 圖片

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2022-12-05 09:31:51

接口lambda表達式

2024-03-08 09:45:21

Lambda表達式Stream

2020-10-16 10:07:03

Lambda表達式Java8

2022-12-01 07:38:49

lambda表達式函數式

2009-08-10 10:06:10

.NET Lambda

2009-08-31 17:11:37

Lambda表達式

2009-09-17 09:09:50

Lambda表達式Linq查詢

2021-08-31 07:19:41

Lambda表達式C#

2020-10-16 06:40:25

C++匿名函數

2009-09-15 15:18:00

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-11 09:48:27

Linq Lambda

2009-08-10 17:11:34

.NET 3.5擴展方Lambda表達式

2009-10-12 10:11:08

Lambda表達式編寫

2024-03-12 08:23:54

JavaLambda函數式編程

2009-09-17 09:44:54

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-08-27 09:44:59

C# Lambda表達

2012-06-26 10:03:58

JavaJava 8lambda
點贊
收藏

51CTO技術棧公眾號

欧美日韩在线看| 日本vs亚洲vs韩国一区三区二区| 欧美成人官网二区| 国产h视频在线播放| 日本黄在线观看| 精品亚洲成a人在线观看| 欧美激情一区二区三区在线视频观看 | 精品国产综合| 亚洲一区二区三区高清视频| 伊人成人网在线看| 日韩中文字幕亚洲| 蜜臀av一区二区三区有限公司| 三级成人黄色影院| 亚洲精品久久久久久国产精华液| 欧美一区二区三区在线免费观看| 亚洲国产剧情在线观看| 蜜桃视频第一区免费观看| 韩国三级电影久久久久久| 午夜激情视频在线播放| 日韩丝袜视频| 日韩欧美中文字幕一区| 男人添女人下面免费视频| 国产v日韩v欧美v| 亚洲免费观看高清完整| 亚洲不卡一卡2卡三卡4卡5卡精品| aaaa一级片| 久久精品国产亚洲一区二区三区| 97在线观看视频国产| 精品国产视频在线观看| 日韩久久视频| 亚洲人精选亚洲人成在线| 中文在线观看免费视频| 国产精品久久免费视频| 在线精品亚洲一区二区不卡| 奇米影视亚洲色图| 超鹏97在线| 日韩美女久久久| 亚洲欧美一区二区原创| 外国精品视频在线观看 | 五月天婷婷丁香网| 久久91精品| 亚洲欧美在线一区| 特大黑人巨人吊xxxx| 国产精品自在| 亚洲大胆人体在线| 国产精久久久久| 99精品国产一区二区三区2021 | 国产一区二区三区福利| 91美女在线视频| 久99久在线| 头脑特工队2在线播放| 99久久777色| 国产美女在线精品免费观看| 国产91绿帽单男绿奴| 岛国精品在线播放| 国产一区二区三区无遮挡| 亚洲女人18毛片水真多| 成a人片国产精品| 狠狠色综合网站久久久久久久| 日本成人动漫在线观看| 9色porny自拍视频一区二区| 精品国产第一页| 精品视频二区| 国产精品久久精品日日| 超薄肉色丝袜足j调教99| 欧美xxx黑人xxx水蜜桃| 亚洲1区2区3区视频| 国产免费黄视频| 一区二区三区精| 久草在线在线精品观看| 91在线观看免费高清| www三级免费| 波多野结衣亚洲一区| 久久久久久国产精品免费免费| 欧美黄色小说| 国产精品日产欧美久久久久| 亚洲激情免费视频| 日韩欧美精品一区二区三区| 欧美自拍丝袜亚洲| 欧美一级小视频| 国产劲爆久久| 国产香蕉一区二区三区在线视频| 夫妻性生活毛片| 亚洲精选久久| 国产精品视频免费在线| 91成品人影院| 91丨九色丨尤物| 伊人狠狠色丁香综合尤物| 精品少妇一区二区三区| 国产又粗又猛又爽又黄| 欧美变态挠脚心| 中文字幕精品网| 麻豆影视在线播放| 视频一区在线播放| 99re在线观看| 懂色av中文在线| 亚洲午夜精品在线| 欧美日韩中文不卡| 久久久亚洲欧洲日产| 中文字幕日韩精品有码视频| 日韩激情一区二区三区| 精品一二三四在线| 久久久av水蜜桃| www视频在线免费观看| 色综合天天综合| 2025中文字幕| 欧美电影一区| 日本精品一区二区三区在线播放视频| 国产成人a人亚洲精品无码| 久久网站热最新地址| 日本老太婆做爰视频| 日韩另类视频| 亚洲韩国欧洲国产日产av | 国产精品国产馆在线真实露脸| 91丨porny丨探花| 国产一区二区高清在线| 国产亚洲在线播放| 中文字幕激情小说| 高清不卡一区二区在线| 中文字幕在线亚洲三区| 亚洲成av在线| 亚洲精品小视频| 亚洲激情视频一区| 国产成人激情av| 久久免费视频2| 91久久久久久白丝白浆欲热蜜臀| 亚洲欧洲国产精品| 91久久国产视频| 成人精品小蝌蚪| 99久久99久久精品| 91精品福利观看| 日韩在线视频免费观看| 日韩xxx视频| 国产欧美日韩中文久久| 亚洲精品无码久久久久久| 国产毛片精品| 高清视频欧美一级| 不卡视频在线播放| 一区二区三区在线看| 欧美性猛交xxxx乱大交91| 爽成人777777婷婷| 国产精品入口日韩视频大尺度| 加勒比一区二区三区在线| 精品久久在线播放| 少妇户外露出[11p]| 夜久久久久久| 欧美一区2区三区4区公司二百| 忘忧草在线影院两性视频| 日韩精品亚洲元码| 日日噜噜噜噜人人爽亚洲精品| 久久免费视频色| 国产激情在线观看视频| 成人久久久久| 国产欧美一区二区| 国产视频一区二区| 日韩一二三区不卡| 国产一级黄色av| av电影在线观看一区| 一女被多男玩喷潮视频| 国产欧美日韩精品一区二区免费| 国产精品久久久久aaaa九色| av黄色在线观看| 91精品国产色综合久久不卡电影| 欧美性猛交xxxxx少妇| 成人性生交大片免费看中文网站| 久久久亚洲精品无码| 精品中文一区| 国产日韩av高清| 视频在线这里都是精品| 亚洲精品按摩视频| 国产91av在线播放| 一区二区三区在线高清| 国产夫妻性爱视频| 欧美aaaaaa午夜精品| 91嫩草国产丨精品入口麻豆| 欧美人妖视频| 国产精品人成电影| 青青草原国产在线| 精品中文字幕久久久久久| 亚洲视频在线免费播放| 夜夜精品视频一区二区| 国产精品久久久久无码av色戒| 肉肉av福利一精品导航| 欧美一级特黄aaaaaa在线看片| 加勒比色老久久爱综合网| 国产精品精品一区二区三区午夜版| 二区在线播放| 亚洲欧美精品在线| 性色av蜜臀av| 91国产免费看| 国产一级中文字幕| 欧美国产成人在线| 久久免费精品国产| 美腿丝袜在线亚洲一区| 精品人妻少妇一区二区| 91亚洲成人| 美女三级99| 中文字幕视频精品一区二区三区| 国产精品91久久| 日本动漫理论片在线观看网站 | 在线成人高清不卡| 中日韩精品视频在线观看| 中文字幕一区av| 亚洲精品成人无码熟妇在线| 国产麻豆一精品一av一免费| 免费黄色一级网站| 尤物在线精品| 日本女人高潮视频| 日本不卡免费一区| 久久久久久九九| 97视频一区| 91亚洲永久免费精品| 123成人网| 欧美一区二区三区图| 中文字幕一区电影| 日本不卡免费播放| 精品国产一区二区三区不卡| 国产精品区在线观看| 色94色欧美sute亚洲线路二| 国产精品免费av一区二区| 亚洲欧美国产毛片在线| 中文字幕在线观看二区| 久久人人爽人人爽| 五十路六十路七十路熟婆 | 欧美日本一区二区在线观看| 四虎成人在线观看| 精品日本美女福利在线观看| www.av视频在线观看| 亚洲精品成人精品456| 欧美成人777| **网站欧美大片在线观看| 国产精品一区二区亚洲| 国产精品美女久久久久久 | 亚洲国产综合视频在线观看| 外国一级黄色片| 亚洲精品久久7777| 色在线观看视频| 亚洲欧美激情插| 精国产品一区二区三区a片| 亚洲欧美欧美一区二区三区| www.av成人| 亚洲欧美国产高清| 青青草成人免费| 亚洲图片欧美色图| 日韩成人av毛片| 精品福利在线看| 日本视频在线观看免费| 日本高清无吗v一区| 日本中文字幕在线观看视频| 欧美在线免费观看亚洲| 岳乳丰满一区二区三区| 欧美剧情电影在线观看完整版免费励志电影| 少妇又紧又色又爽又刺激视频| 欧美视频一区二区三区| 97超视频在线观看| 91精品国产高清一区二区三区蜜臀| 99久久久国产精品无码网爆| 日韩精品在线一区二区| 免费国产精品视频| 日韩精品在线私人| 99reav在线| 欧美精品一区二区三区国产精品| 欧美性受ⅹ╳╳╳黑人a性爽| 91精品91久久久久久| yw.尤物在线精品视频| 91精品国产自产在线老师啪| 一区二区在线视频观看| 国产三区精品| 凹凸成人精品亚洲精品密奴| 中文字幕一区二区三区四区五区| 欧美日韩 国产精品| 国产深夜男女无套内射| 首页国产欧美日韩丝袜| 中文字幕av一区二区三区人妻少妇| 粉嫩一区二区三区在线看| 午夜理伦三级做爰电影| 国产精品不卡一区| 在线看成人av| 精品视频一区三区九区| 丁香花免费高清完整在线播放| 亚洲开心激情网| 黄色网在线免费看| 97热精品视频官网| 精品九九久久| 狠狠色综合一区二区| 久久一区91| 国产精品333| 激情欧美日韩一区二区| 久久精品综合视频| 中文字幕一区日韩精品欧美| 香蕉免费毛片视频| 欧美日韩精品一区二区三区蜜桃 | 欧美综合在线播放| 精品在线播放午夜| 香蕉网在线播放| 亚洲综合图片区| 中文字幕欧美人妻精品一区蜜臀| 欧美精品一区二区三区很污很色的 | 激情五月俺来也| zzijzzij亚洲日本少妇熟睡| 影音先锋男人资源在线观看| 午夜成人免费视频| 99久久久无码国产精品免费| 亚洲欧美日韩爽爽影院| 欧美巨大xxxx做受沙滩| 成人高清视频观看www| 美女亚洲一区| 日韩五码在线观看| 国产一区二区三区久久久| 亚洲国产日韩一区无码精品久久久| 亚洲综合成人网| 国产又粗又猛又黄又爽无遮挡| 亚洲性日韩精品一区二区| 啊啊啊久久久| 亚洲专区在线视频| 久久亚洲精品中文字幕蜜潮电影| 92看片淫黄大片一级| 成人激情小说乱人伦| 久久久久久视频| 777奇米成人网| 成人网视频在线观看| 日本91av在线播放| 欧美激情99| 久久国产午夜精品理论片最新版本| 狠狠狠色丁香婷婷综合激情| 国产日韩精品中文字无码| 在线观看www91| 蝌蚪视频在线播放| 欧美与欧洲交xxxx免费观看| 欧美天堂影院| www.中文字幕在线| 91在线观看一区二区| 中文字幕在线字幕中文| 日韩精品一区二区三区第95| av最新在线| 九色视频成人porny| 国产欧美日韩一区二区三区在线| 国产二级一片内射视频播放| 婷婷六月综合亚洲| 亚洲三级黄色片| 国产91精品久| 欧美猛男男男激情videos| 黄色片视频在线免费观看| 91免费观看视频在线| 免费黄色网址在线| 亚洲系列中文字幕| av一区在线播放| 一区视频二区视频| 国产一区二区三区高清播放| 国产一区二区播放| 日韩欧美电影一区| 91福利在线免费| 免费观看成人高| 日韩黄色免费电影| www成人啪啪18软件| 欧美一区二区在线免费播放| 黄色的视频在线观看| 国产一区二区在线网站 | 欧美视频一区二区三区…| 日本一本草久在线中文| 国产精品户外野外| 国产精品国产一区| 中文字幕在线国产| 午夜精品久久久久久久久久| 麻豆影视在线| 91在线观看免费| 中文在线一区| 香蕉成人在线视频| 欧美xxxx老人做受| 日本在线高清| 一区不卡字幕| 懂色av一区二区三区免费看| 麻豆成人免费视频| www.日韩.com| 久久久久高潮毛片免费全部播放| 欧美一级黄色影院| 亚洲免费色视频| 欧美日韩伦理片| 成人激情春色网| 亚洲精品1234| 日本高清黄色片| 亚洲成人动漫在线播放| 日本成人片在线| 菠萝蜜视频在线观看入口| 久久婷婷综合激情| 99这里有精品视频| 日韩av电影院| 欧美在线观看天堂一区二区三区| 亚洲欧美视频在线播放| 欧美老女人第四色| 国产美女高潮在线| 制服丝袜综合日韩欧美| 99r国产精品| 99在线观看免费| 国产精品麻豆va在线播放| 在线日韩视频| 日本a级片视频| 中文字幕亚洲专区| 视频福利一区| 亚洲AV无码久久精品国产一区|