讀Java實戰(第二版)筆記02_行為參數化Lambda表達式

来源:https://www.cnblogs.com/lying7/archive/2023/02/06/17094341.html
-Advertisement-
Play Games

977. 有序數組的平方 題目描述 給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。 思路 我採用的是雙指針進行解答 首先應明確,數組是有序數組,那麼在考慮複數的情況下,平方後的最小值一定在數組的兩端,那麼便可以設置左指針left與右 ...


1. 行為參數化

1.1. 處理頻繁變更的需求的一種軟體開發模式

1.1.1. 不管你做什麼,用戶的需求肯定會變

1.1.2. 可讓代碼更好地適應不斷變化的要求,減輕未來的工作量

1.2. 一個方法接受多個不同的行為作為參數,併在內部使用它們,完成不同行為的能力

1.2.1. 類似於在內聯“傳遞代碼”

1.2.2. 重覆使用同一個方法,給它不同的行為來達到不同的目的

1.2.2.1. DRY(Don't Repeat Yourself,不要重覆自己)

1.2.2.2. 例如:把迭代要篩選的集合的邏輯與對集合中每個元素應用的行為區分開來

1.3. 傳遞代碼就是將新行為作為參數傳遞給方法

1.3.1. 在Java 8之前可以用匿名類

1.3.1.1. 匿名類和局部類(塊中定義的類)差不多,但匿名類沒有名字

1.3.1.2. GUI應用程式中經常使用匿名類來創建事件處理器對象

1.3.1.3. 聲明很多只要實例化一次的類

1.3.2. 以用不同行為進行參數化的方法,包括排序、線程和GUI處理

2. Lambda表達式

2.1. 基本語法

2.1.1. 塊-風格的Lambda

2.1.1.1. (parameters) -› { statements; }

2.1.2. 表達式-風格的Lambda

2.1.2.1. (parameters) -› expression

2.2. 沒有聲明名稱的方法

2.3. 和匿名類一樣,也能作為參數傳遞給一個方法

2.4. 允許你直接以內聯的形式為函數式介面的抽象方法提供實現,並把整個表達式作為函數式介面的實例

2.5. 一種簡潔的可傳遞匿名函數:它沒有名稱,但它有參數列表、函數主體、返回類型,可能還有一個可以拋出的異常列表

2.5.1. 匿名

2.5.2. 函數

2.5.2.1. 有參數列表、函數主體、返回類型,還可能有可以拋出的異常列表

2.5.3. 傳遞

2.5.3.1. 可以作為參數傳遞給方法或存儲在變數中

2.5.4. 簡潔

2.5.4.1. 無須像匿名類那樣寫很多模板代碼

2.6. 方法調用的返回值為空時,Java語言規範有一條特殊的規定,不需要使用括弧環繞返回值為空的單行方法調用

2.7. 捕獲Lambda允許使用自由變數(不是參數,而是在外層作用域中定義的變數),就像匿名類一樣

2.7.1. 可以沒有限制地捕獲(也就是在其主體中引用)實例變數和靜態變數

2.7.2. 局部變數必須顯式聲明為final,或事實上是final

2.7.2.1. 只能捕獲指派給它們的局部變數一次

2.7.2.2. 捕獲實例變數可以被看作捕獲最終局部變數this

2.7.2.3. 不能修改定義Lambda的方法的局部變數的內容。這些變數必須是隱式最終的

2.7.3. 實例變數都存儲在堆中

2.7.3.1. 堆是線上程之間共用的

2.7.4. 局部變數則保存在棧上

2.7.4.1. 允許捕獲可改變的局部變數,就會引發造成線程不安全的新的可能性

2.7.4.2. 在訪問自由局部變數時,實際上是在訪問它的副本,而不是訪問基本變數

2.7.5. 不鼓勵你使用改變外部變數的典型命令式編程模式

2.8. Lambda是對值封閉,而不是對變數封閉

2.9. 閉包就是一個函數的實例,且它可以無限制地訪問那個函數的非本地變數

2.9.1. 可以訪問和修改其作用域之外的變數

3. 匿名內部類

3.1. 也可以完成Lambda表達式同樣的事情,比較笨拙:需要提供一個實現,然後再直接內聯將它實例化

4. 方法引用

4.1. 僅調用特定方法的Lambda的一種快捷寫法

4.1.1. 更易讀

4.1.2. 更自然

4.2. 僅涉及單一方法的Lambda的語法糖

4.2.1. 同樣的事情時要寫的代碼更少

4.3. 如果一個Lambda代表的只是“直接調用這個方法”,那最好還是用名稱來調用它,而不是去描述如何調用它

4.4. 指向靜態方法的方法引用

4.4.1. 例如Integer的parseInt方法,寫作Integer::parseInt

4.5. 指向任意類型實例方法的方法引用

4.5.1. 例如String的length方法,寫作String::length

4.6. 指向現存對象或表達式實例方法的方法引用

4.6.1. 例如你有一個局部變數expensive Transaction保存了Transaction類型的對象,它提供了實例方法getValue,那你就可以這麼寫expensive-Transaction::getValue

4.7. 構造函數引用

4.7.1. 對於一個現有構造函數,你可以利用它的名稱和關鍵字new來創建它的一個引用:ClassName::new

4.7.2. 不將構造函數實例化卻能夠引用它

4.7.3. 語言本身並沒有提供的函數式介面,可以自己創建一個

5. 函數式介面

5.1. 只定義一個抽象方法的介面

5.1.1. 很多預設方法,只要介面只定義了一個抽象方法,仍然是一個函數式介面

5.1.2. 預設方法不是抽象方法

5.2. 函數式介面的抽象方法的簽名稱為函數描述符

5.2.1. 基本上就是Lambda表達式的簽名

5.3. @FunctionalInterface

5.3.1. 這個標註用於表示該介面會設計成一個函數式介面,因此對文檔來說非常有用

5.3.2. 不是必需的,但對於為此設計的介面而言,使用它是比較好的做法

5.4. java.util.function包中新的函數式介面

5.4.1. Predicate‹T›介面定義了一個名叫test的抽象方法,它接受泛型T對象,並返回一個boolean

5.4.1.1. 謂詞(即一個返回boolean值的函數)

5.4.2. Consumer‹T›介面定義了一個名叫accept的抽象方法,它接受泛型T的對象,沒有返回(void)

5.4.3. Function‹T, R›介面定義了一個叫作apply的抽象方法,它接受泛型T的對象,並返回一個泛型R的對象

5.4.3.1. 配了andThen和compose兩個預設方法,它們都會返回Function的一個實例

5.4.4. Supplier‹T›

5.4.5. BinaryOperator‹T›

5.5. 函數式介面中的任何一個都不允許拋出受檢異常(checked exception)

5.5.1. 定義一個自己的函數式介面,並聲明受檢異常

5.5.2. 把Lambda包在一個try/catch塊中

5.5.2.1. 環繞執行(execute around)模式

6. 裝箱(boxing)

6.1. 將基本類型轉換為對應的引用類型的機制

7. 拆箱(unboxing)

7.1. 將引用類型轉換為對應的基本類型

8. 自動裝箱機制

8.1. 裝箱和拆箱操作是自動完成的

9. 特殊處理

9.1. IntPredicate

9.2. DoublePredicate

9.3. ToIntFunction‹T›

9.4. IntConsumer

9.5. LongBinaryOperator

9.6. IntFunction

9.7. IntToDoubleFunction

10. 目標類型

10.1. Lambda的類型是從使用Lambda的上下文推斷出來的

10.2. 上下文(比如,接受它傳遞的方法的參數,或接受它的值的局部變數)中Lambda表達式需要的類型

10.3. 同一個Lambda表達式就可以與不同的函數式介面聯繫起來,只要它們的抽象方法簽名能夠相容

10.4. Lambda表達式的上下文是Object(目標類型)。但Object不是一個函數式介面。

10.4.1. 你可以把目標類型改成Runnable,它的函數描述符是() -› void

10.5. 為了消除顯式的二義性,你可以對Lamda進行強制類型轉換

10.6. 有時候顯式寫出類型更易讀,有時候去掉它們更易讀


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 我們在JavaWeb開發中必不可少的就是jar包管理-maven,在沒有maven之前,都是自己手動下載jar包導入到項目中,非常的繁瑣。 maven出現之後,又迎來新的問題,對於倉庫裡人家發佈的都可以引用下載,但是公司自己內部寫的jar包,不想讓外人看到,自己公司來回粘貼複製,非常的繁瑣 ...
  • 摘要:JVM參數分為三類:標準參數、非標準參數(-X參數)和高級選項(-XX參數)。本文主要為大家講解-X參數和-XX參數。 本文分享自華為雲社區《JVM運行參數之-X和-XX參數》,作者:共飲一杯無 。 JVM參數分為三類:標準參數、非標準參數(-X參數)和高級選項(-XX參數)。本文主要為大家講 ...
  • 裝飾器是 Python 編程中常用的一個功能,可以將通用的邏輯抽象成裝飾器,通過裝飾器語法應用到不同的目標上,達到增強或修改目標邏輯的目的。 先來看一個簡單的例子 # 列印耗時的裝飾器 def log(f): def inner(*args, **kw): start = time.perf_cou ...
  • 不管多少人黑微軟,微軟出品的大多數產品都能夠深入人心,成為精品。在資料庫領域,微軟為專業人士提供SQL Server(簡稱mssql)。為日常辦公人士提供Access與Excel這兩款數據存儲與分析的神器。 ...
  • 一、註解篇 1.1、註解的基本概念 註解:一種代碼級別的說明,它是JDK1.5及以後版本引入的一個特性,與類、介面、枚舉是在同一個層次;它可以聲明在包、類、欄位、方法、局部變數、方法參數等的前面,用來對這些元素進行說明,註釋. 要將註解(annotation)和註釋(commnet)分開,註釋是給人 ...
  • 最近學習代碼看到很多有趣的註解;慢慢整理下: @Accessors註解 @Accessors註解官方給出的解釋是:面向getter和setter的更流暢的API。用於生成和查找getter和setter的方式。 三個用法: 1、@Accessors(chain=true) 鏈式訪問,該註解設置cha ...
  • (圖作者 | 吾愛破解@Ps出來的小趙) 吾愛破解每年都有個解題領紅包活動,今年也不例外,需要我們使出看家逆向本領來分析內容獲得口令紅包,根據難度等級不同會獲得不同數量的吾愛幣,活動持續到元宵節結束。活動一共有十個題,本文僅分享 Web 初級、中級、高級三個題的逆向思路。 活動地址:https:// ...
  • springboot中經常會用到properties文件中的配置,一般使用@Value註入,但是針對Utils工具類,需要註入一個靜態變數有幾種方法?為什麼有的同學註入的值為null? 代碼示例 如果直接使用@Value註入是什麼結果? /** * the StaticInjectionUtils ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...