成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java8函數式接口和Lambda表達式,你真的會了嗎

開發 后端
Java8 由Oracle在2014年發布,是繼Java5之后最具革命性的版本了。Java8吸收其他語言的精髓帶來了函數式編程,lambda表達式,Stream流等一系列新特性,學會了這些新特性,可以讓你實現高效編碼優雅編碼。

 [[346664]]

本文轉載自微信公眾號「愛笑的架構師」,作者雷架 。轉載本文請聯系愛笑的架構師 公眾號。    

Java8 由Oracle在2014年發布,是繼Java5之后最具革命性的版本了。Java8吸收其他語言的精髓帶來了函數式編程,lambda表達式,Stream流等一系列新特性,學會了這些新特性,可以讓你實現高效編碼優雅編碼。

Lambda表達式小試牛刀

Lambada表達式可以理解為:可傳遞的匿名函數的一種簡潔表達方式。Lambda表達式沒有名稱,同普通方法一樣有參數列表、函數主體、返回類型等;

下面簡單看一個例子,new一個線程打印字符串,采用lambda表達式非常簡潔:

  1. new Thread(() -> System.out.println("hello java8 lambda")).start() 

 Thread類接受一個Runnable類型實例,查看Jdk源碼發現Runnable接口是一個函數式接口,可以直接用lambda表達式替代。

  1. @FunctionalInterface 
  2. public interface Runnable { 
  3.     public abstract void run(); 
  4. [[346665]]

Lambda表達式語法非常簡單:

  1. () -> System.out.println("hello java8 lambda"[[346665]]

 

  • ()括號里面是參數列表,如果只有一個參數還可以寫為:a -> System.out.println(a)
  • -> 箭頭為固定寫法;
  • System.out.println("hello java8 lambda") 為函數主體,如果有多條語句要用花括號包裹起來, 比如下面這樣:
  1. (a, b) -> {int sum = a + b; return sum;} 

 綜上,Lambda表達式模塊可以固化為:

  1. (parameter) -> {expression} 或者 (parameter) -> {statements; statements; } 

 數只有一個可以省略括號

如果不用Lambda表達式,使用匿名內部類的方式,寫法就不是那么優雅了。

  1. // before Java8 
  2. new Thread(new Runnable() { 
  3.     @Override 
  4.     public void run() { 
  5.         System.out.println("hello java8 without lambda"); 
  6.     } 
  7. }).start(); 

 Lambda高階用法

(1)函數式接口

函數式接口是只定義了一個抽象方法的接口。注意Java8中允許存在默認方法(default),哪怕有很多默認方法,只要有且僅有一個抽象方法,那么這個接口仍然是函數式接口。

函數式接口通常在類上有一個注解@FunctionalInterface,如:

  1. @FunctionalInterface 
  2. public interface Runnable { 
  3.     public abstract void run(); 

 (2)函數式接口可以干什么?

通常lambda表達式與函數式接口結合一起用,lambda表達式以內聯的形式為函數式接口的抽象方法提供實現,把整個表達式作為函數式接口的實例。在沒有lambda表達式之前,我們通常會使用匿名內部類的方式實現,詳細對比見第一小節的實例代碼。

(3)函數描述符

函數式接口抽象方法的簽名基本上就是lambda表達式的簽名,我們可以將這種對應關系稱為函數描述符。由一個函數式接口的抽象方法抽象為一個函數描述符,這個過程非常重要,知道了函數描述符去寫lambda表達式也就非常容易了。舉個例子:

Runnable接口有一個抽象方法 void run(), 接受空參數返回void,那么函數描述符可以推導為:

  • () -> void
  • lambda表達式可以寫為
  • () -> System.out.println("hello java8 lambda")

(4)常用函數式接口

java8 中常用函數式接口,針對基本類型java還定義了IntPredicate, LongPredicate等類型,詳細可以參考jdk源碼。

函數式接口 函數描述符
Predicate T->boolean
Consumer T->void
Function<T,R> T->R
Supplier () -> T
UnaryOperator T -> T
BinaryOperator (T,T)->T
BiPredicate<L,R> (L,R)->boolean
BiConsumer<T,U> (T,U)->void
BiFunction<T,U,R> (T,U)->R

至于 Predicate, Consumer, Function這些函數式接口具體作用,在后面的文章中會詳細介紹,這里只需有個大體印象即可。

(5)將lambda表達式重構為方法引用

方法引用可以看作是lambda表達式的一種快捷寫法,它可以調用特性的方法作為參數傳遞。你也可以將方法引用看作是lambda表達式的語法糖,讓lambda表達式寫起來更加簡介。舉個栗子,按學生年齡排序:

  1. // before 
  2. students.sort((s1, s2) -> s1.getAge.compareTo(s2.getAge())))); 
  3. // after 使用方法引用 
  4. students.sort(Comparator.comparing(Student::getAge())))); 

 方法引用主要有三類:

  • 靜態方法的方法引用

valueOf是String類的靜態方法,方法引用寫為 String::valueOf, 對應lambda表達式:a -> String.valueOf(a)

  • 任意類型實例方法的方法引用

length是String類的實例方法,方法引用寫為 String::length,對應lambda表達式:(str) -> str.length()

  • 現有對象的實例方法的方法引用

第三種容易與第二種混淆,現有對象指的是在lambda表達式中調用外部對象(不是入參對象)的實例方法,比如:

  1. String str = "hello java8"
  2. () -> str.length(); 

 對應方法引用寫為 str::length, 注意不是 String::length

最后我們將三類方法引用歸納如下:

lambda表達式 方法引用  
(args) -> ClassName.staticMethod(args) ClassName::staticMethod 靜態方法方法引用
(arg0, params) -> arg0.instanceMethod(params) ClassName::instanceMethod 內部實例方法引用
arg0
(params) -> arg0.instanceMethod(params)
arg0.instanceMethod 外部實例方法引用

總結:通過這篇文章的學習應該是對java8函數式編程和lambda表達式有了一個初步的了解,后面會有真實項目實戰演練,敬請期待吧~

 

責任編輯:武曉燕 來源: 愛笑的架構師
相關推薦

2023-12-24 22:30:05

LambdaJava函數

2012-07-18 09:45:32

Java 8ScalaLambda

2024-12-02 10:56:29

2022-12-05 09:31:51

接口lambda表達式

2012-06-26 10:03:58

JavaJava 8lambda

2024-03-08 09:45:21

Lambda表達式Stream

2022-12-01 07:38:49

lambda表達式函數式

2013-04-07 15:44:26

Java8Lambda

2021-06-28 08:01:57

JS 函數表達式函數聲明

2013-04-07 10:04:03

Java8Lambda

2009-08-10 10:06:10

.NET Lambda

2020-09-22 11:00:11

Java技術開發

2023-07-26 07:13:55

函數接口Java 8

2009-08-31 17:11:37

Lambda表達式

2021-05-05 11:31:15

JDK新特性Lambda表達式Java8

2015-08-04 09:16:20

JavaLambda表達式

2009-09-17 09:09:50

Lambda表達式Linq查詢

2020-10-16 06:40:25

C++匿名函數

2021-08-31 07:19:41

Lambda表達式C#

2009-09-11 09:48:27

Linq Lambda
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久免费 | 夜夜爽99久久国产综合精品女不卡 | 精品一二三| 欧美乱大交xxxxx另类电影 | 国产三级精品三级在线观看四季网 | 亚洲精品视频在线观看免费 | 国产精品成人一区 | 日本一道本 | 色综久久| 不卡一区 | 中文字幕在线免费观看 | 91视视频在线观看入口直接观看 | 国产农村妇女精品一区 | 免费在线视频精品 | 久久tv在线观看 | 国产 亚洲 网红 主播 | 有码一区 | 国产在线视频一区二区董小宛性色 | 欧美激情精品久久久久久 | 日韩中文字幕在线视频观看 | 日韩一区二区三区四区五区 | 五月天婷婷久久 | 日韩视频一区在线观看 | 日韩精品一区二区三区中文字幕 | 日日夜夜精品视频 | 噜噜噜噜狠狠狠7777视频 | 久久福利电影 | 在线色网址| 婷婷福利 | 成人午夜在线观看 | 欧美一级黑人aaaaaaa做受 | 国产一级电影在线观看 | 91精品国产91久久久久福利 | 在线观看欧美一区 | 色男人的天堂 | 日韩中文字幕免费在线 | 91视频.com| 欧美在线观看免费观看视频 | 欧美一区二区三区四区视频 | 久久精品视频91 | 91精品免费视频 |