欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8與Scala中的Lambda表達式深入講解

 更新時間:2018年11月12日 16:07:59   作者:散裝海盜  
這篇文章主要給大家介紹了關于Java8與Scala中Lambda表達式的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近幾年Lambda表達式風靡于編程界。很多現(xiàn)代編程語言都把它作為函數(shù)式編程的基本組成部分?;贘VM的編程語言如Scala、Groovy及Clojure把它作為關鍵部分集成在語言中。而如今,(最終)Java 8也加入了這個有趣的行列。

Java8 終于要支持Lambda表達式!自2009年以來Lambda表達式已經(jīng)在Lambda項目中被支持。在那時候,Lambda表達式仍被稱為Java閉包。在我們進入一些代碼示例以前,先來解釋下為什么Lambda表達式在Java程序員中廣受歡迎。

1、為什么使用Lambda表達式

Lambda表達式通常使用在圖形用戶界面(GUI)的開發(fā)中。一般來說,GUI編程將程序行為和事件做連接。比如,當用戶按下一個按鈕(觸發(fā)一個事件),你的程序就需要去執(zhí)行某些行為,可能是將一些數(shù)據(jù)儲存到一個數(shù)據(jù)存儲器中。在Swing中,可以使用ActionListener來實現(xiàn):

class ButtonHandler implements ActionListener {
 public void actionPerformed(ActionEvent e) {
 //do something
 }
}

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(new ButtonHandler());
 }
}

這個例子表明了 ButtonHandler 類作為一個回調替換的用法。在這里 ButtonHandler 類僅包含 ActionListener 接口定義的 actionPerformed 方法。我們可以使用匿名內部類來簡化代碼:

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent event) {
 //do something
 }
 })
 }
}

這樣代碼簡潔多了。更仔細的去看代碼時,就會發(fā)現(xiàn)我們還創(chuàng)建一個只生成一個實例的類,而這個實例也僅僅持有一個獨立的方法。這恰好是Lambda表達式所能解決的其中一類問題。

2、Lambda表達式代替函數(shù)

一個lambda表達式從字面上講就是一個函數(shù)。它定義了一個函數(shù)的輸入?yún)?shù)和函數(shù)體。Java 8 中的,lambda表達式語法尚未確定,不過大致應該類似這個樣子的:

(type parameter) -> function_body

一個具體的例子:

(String s1, String s2) -> s1.length() - s2.length();

這個lambda表達式用來計算兩個字符串的長度差。還有一些擴展的語法,比如避免參數(shù)的類型定義(我們馬上見看到例子)還有使用{和}來支持多行定義。

Collections.sort() 方法是lambda表達的理想例子。它允許我們將字符串按照長度排序:

List<String> list = Array.asList("loooooong", "short", "tiny");
Collections.sort(list, (String s1, String s2) -> s1.length() - s2.length());
> "tiny", "short", "loooooong".

所以,不像現(xiàn)在java必須要求的向sort方法輸入一個已經(jīng)實現(xiàn)的Comparator(比較器)而是傳送一個lambda表達式我們就可以得到相同的結果。

3、Lambda表達式代替閉包

lambda表達式有許多有趣的特性。其中之一是,它們是閉包。一個閉包允許函數(shù)訪問直接詞法作用域之外的變量。

String outer = "java 8"
(String s1) -> s1.length() - outer.length()

在例子中,lambda表達式訪問了字符串 outer 這個作用域之外定義的變量。對于內聯(lián)閉包來說這是很難做到的。

4、Lambda表達式也支持類型推論

類型推論是java 7 引入的但它同樣適用于lambda表達式。簡單來說,類型推論意味著程序員可以在任意一個編譯器能夠自動推斷出類型的地方省略類型定義。

如果類型推論能夠應用到前面的排序lambda表達式上,那么它就能寫成下面的樣子:

List<String> list = Arrays.asList(...);
Collections.sort(list, (s1, s2) -> s1.length()-s2.length());

就像你所見到的一樣,參數(shù)s1和s2的類型被省略了。因為編譯器知道list是一個字符串集合,它知道被用來作為比較器的lambda表達式必定是相同的類型。因此,這個類型不需要顯式地聲明,即使你有這么做的自由。

類型推論的主要優(yōu)勢就是減少樣板代碼,如果編譯器可以為我們識別類型,為什么我們必須自己定義它們。

5、珍愛Lambda表達式,遠離匿名內部類

我們來體會下,為何lambda表達式和類型推論有助于簡化我們前面所提到的回調例子:

class UIBuilder {
 public UIBuilder() {
 button.addActionListener(e -> //process ActionEvent e)
 }
}

我們下載直接傳送一個lambda表達式進入 addActionListener 方法來代替前面定義的持有回調方法的類。除了減少模板代碼和提高可讀性以外,它使我們直接表達我們唯一感興趣的事情:處理事件。

在我們了解lambda表達式更多優(yōu)勢之前,先來看看在Scala中的lambda表達式副本。

6、Scala中的Lambda表達式

在函數(shù)式編程中,函數(shù)是基本的構造塊。Scala融合了java中的面向對象編程和函數(shù)式編程。在Scala中,一個lambda表達式是種叫做“函數(shù)”或者“函數(shù)文本”。Scala中的函數(shù)屬于一等公民。它們可以被分配給vals或者vars(最終變量或者非最終變量),它們可以作為其他函數(shù)的參數(shù),也可以組合成新的函數(shù)。

在Scala中一個函數(shù)文本寫成如下形式:

(argument) => //funtion body

舉例來說,前面提到的java 用來計算兩個字符串長度差的 lambda 表達式,在Scala中寫作如下:

(s1: String, s2 :String) => s1.length - s2.length

Scala中的函數(shù)文本也是閉包。它可以訪問在直接詞法作用域之外定義的變量。

val outer =10
val myFuncLiteral = (y: Int) => y * outer
val result = myFuncLiteral(2)
> 20

這個例子結果是20.

正如你所見,我們將函數(shù)文本分配給了變量 myFuncLiteral。

java 8 的lambda表達式和Scala的函數(shù)文本在語法和語義上的相似性是十分明顯的。從語義上講它們是相同的,而語法上的唯一不同就是箭頭符號(java8 ->, scala =>)和我們沒有提到的簡化符號。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 詳解SpringBoot 使用Spring Initializr 快速構建工程(官方推薦)

    詳解SpringBoot 使用Spring Initializr 快速構建工程(官方推薦)

    本篇文章主要介紹了SpringBoot 使用Spring Initializr 快速構建工程(官方推薦),非常具有實用價值,需要的朋友可以參考下
    2017-10-10
  • Springboot如何實現(xiàn)自定義異常數(shù)據(jù)

    Springboot如何實現(xiàn)自定義異常數(shù)據(jù)

    這篇文章主要介紹了Springboot如何實現(xiàn)自定義異常數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • spring事務里面開啟線程插入報錯了是否會回滾

    spring事務里面開啟線程插入報錯了是否會回滾

    這篇文章主要介紹了spring事務里面開啟線程插入,報錯了是否會回滾?這是小編遇到一道面試題,題目大概是這個樣子,今天抽空通過示例代碼給大家分析下,需要的朋友可以參考下
    2023-04-04
  • Spring的同一個服務會加載多次的問題分析及解決方法

    Spring的同一個服務會加載多次的問題分析及解決方法

    這篇文章主要介紹了Spring的同一個服務為什么會加載多次,我們先來梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • IntelliJ?IDEA?2022安裝注冊永久激活

    IntelliJ?IDEA?2022安裝注冊永久激活

    java開發(fā)工具IntelliJ?IDEA深受用戶喜愛,很多朋友對這個idea開發(fā)工具比較忠心,一旦有新版本發(fā)出,很多小伙伴就迫不及待的想更新,今天小編給大家?guī)砹薸dea2022.1最新永久激活碼,親測有效,喜歡的朋友快來下載體驗吧
    2022-08-08
  • java中Consumer接口的使用教程詳解

    java中Consumer接口的使用教程詳解

    Java?8?引入了?java.util.function?包,其中包含了一些常用的函數(shù)式接口,Consumer?接口是其中一個函數(shù)式接口,用于表示接受一個輸入?yún)?shù)并執(zhí)行某種操作的操作者,下面我們就來學習一下他的具體使用吧
    2023-12-12
  • Mybatis防止sql注入的實例

    Mybatis防止sql注入的實例

    本文通過實例給大家介紹了Mybatis防止sql注入的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • Java中工具Jstack的使用實例

    Java中工具Jstack的使用實例

    jstack用于生成java虛擬機當前時刻的線程快照,下面這篇文章主要給大家介紹了關于Java中工具Jstack使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • java 示例講解循環(huán)語句的使用

    java 示例講解循環(huán)語句的使用

    順序結構的程序語句只能被執(zhí)行一次。如果您想要同樣的操作執(zhí)行多次,就需要使用循環(huán)結構,循環(huán)結構就是在循環(huán)條件滿足的情況下,反復執(zhí)行特定代碼
    2022-04-04
  • SpringBoot項目中日志管理與調優(yōu)指南

    SpringBoot項目中日志管理與調優(yōu)指南

    在 Spring Boot 開發(fā)過程中,日志管理是開發(fā)者必須掌握的重要技能之一,合理的日志配置不僅能幫助開發(fā)者追蹤應用程序的執(zhí)行流程、定位問題,還能提升應用程序的可維護性,本文將詳細探討 Spring Boot 項目中日志管理的常見問題、解決方案以及最佳實踐
    2024-10-10

最新評論