02-詳細介紹Java8新特性方法引用,構造引用,數組引用

方法/構造/數組引用

方法引用

當要傳遞給Lambda體的操作已經有實現的方法時就可以使用方法引用,方法引用和構造器引用就是為了簡化Lambda表達式

  • 方法引用可以看做是Lambda表達式深層次的表達,方法引用本質還是Lambda表達式所以也是函數式接口的一個實例
  • 通過方法的名字來指向一個方法可以認為是Lambda表達式的一個語法糖

語法糖(Syntactic sugar)也譯為糖衣語法是指計算機語言中添加的某種對語言的功能沒有影響但是更方便程序員使用的語法

  • 使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會

方法引用格式: 使用方法引用操作符 “::” 將類或對象方法名分隔開來,要求Lambda體只有一句語句并且是調用一個對象/類的方法

  • 因為引用的方法的形參和返回值函數式接口抽象方法的形參和返回值都相同,所以引用方法的形參可以省略
  • 情況1:對象::實例方法名
  • 情況2:類::靜態方法名
  • 情況3:類::實例方法名

先寫一個Employee實體類

public class Employee {private String name;private Integer id;// get和set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}// 構造方法public Employee() {}public Employee(Integer id) {this.id = id;this.name = name;}public Employee(Integer id,String name) {this.id = id;this.name = name;}
}

**對象::非靜態方法:接口抽象方法a在被重寫時使用了某一個對象的方法b,如果方法a和b的形參列表,返回值類型都相同,則可以使用方法b實現對方法a的重寫替換 **

  • Consumer中的void accept(T t)和PrintStream中的void println(T t)形參列表均為(T t)以及返回值均為void
  • Supplier中的T get()和Employee中的String getName()形參列表均為空以及返回值均為String
@Test
public void test() {// 使用Lambda表達式Consumer<String> consumer01 = s -> System.out.println(s);consumer01.accept("她的手只有我的手四分之三那麼大");System.out.println("-----------------------------");// 使用方法引用//PrintStream printStream = System.out;//Consumer<String> consumer02 = printStream::println;Consumer<String> consumer02 = System.out::println;consumer02.accept("可我還是沒能抓住");
}
@Test
public void test() {Employee emp = new Employee(1001,"Tom");// 使用Lambda表達式Supplier<String> sup1 = () -> emp.getName();System.out.println(sup1.get());System.out.println("*******************");// 使用方法引用Supplier<String> sup2 = emp::getName;System.out.println(sup2.get());}

類::靜態方法: :接口抽象方法a在被重寫時使用了某一個類的靜態方法b,如果方法a和b的形參列表,返回值類型都相同,則可以使用方法b實現對方法a的重寫替換

  • Comparator中的int compare(T t1,T t2)和Integer中的int compare(T t1,T t2)形參列表均為(T t1,T t2)以及返回值均為int
  • Function中的R apply(T t)和Math中的Long round(Double d)返回值和參數列表為泛型
@Test
public void test07() {// 使用Lambda表達式Comparator<Integer> comparator01 = (o1, o2) -> Integer.compare(o1, o2);System.out.println(comparator01.compare(20, 77));System.out.println("----------------------------");// 使用方法引用Comparator<Integer> comparator02 = Integer::compare;System.out.println(comparator02.compare(94, 21));
}@Test
public void test08(){// 使用Lambda表達式Function<Double,Long> function01 = aDouble -> Math.round(aDouble);System.out.println(function01.apply(3.141));System.out.println("------------------------------");// 使用方法引用Function<Double,Long> function02 = Math::round;System.out.println(function02.apply(2.717));
}

類::實例方法: 抽象方法a在被重寫時使用了某一個對象的方法b,如果方法a和b的返回值類型相同但方法b的形參少一個,則可以使用方法b實現對方法a的重寫替換

  • 方法a的形參列表中有n個參數方法b有n-1個參數,方法a的第1個參數作為方法b的調用者,方法a的后n-1個參數與方法b的n-1個參數匹配(類型相同或滿足多態)
  • Comparator中的int comapre(T t1,T t2)方法和String中的int t1.compareTo(t2)方法
  • BiPredicate中的boolean test(T t1, T t2)方法和String中的boolean t1.equals(t2)方法
  • Function中的R apply(T t)方法和Employee中的String toString()方法
@Test
public void test5() {// 使用Lambda表達式Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);System.out.println(com1.compare("abc","abd"));System.out.println("*******************");// 使用方法引用Comparator<String> com2 = String :: compareTo;System.out.println(com2.compare("abd","abm"));
}@Test
public void test10(){// 使用Lambda表達式BiPredicate<String,String> biPredicate01 = (o1, o2) -> o1.equals(o2);System.out.println(biPredicate01.test("Kyle", "Kyle"));// trueSystem.out.println("----------------------------------");// 使用方法引用BiPredicate<String,String> biPredicate02 = String::equals;System.out.println(biPredicate02.test("Violet", "Violet"));// true
}@Test
public void test7() {Employee employee = new Employee(1001, "Jerry");// 使用Lambda表達式Function<Employee,String> func1 = e -> e.getName();System.out.println(func1.apply(employee));System.out.println("*******************");// 使用方法引用Function<Employee,String> func2 = Employee::getName;System.out.println(func2.apply(employee));
}@Test
public void test11(){Ememployee employee = new Employee(1001, "Jerry");Function<Stu,String> function01 = employee -> employee.toString();System.out.println(function01.apply(employee));System.out.println("------------------------------");Function<Employee,String> function02 = Employee::toString;System.out.println(function02.apply(employee employee));
} 

構造器引用

類名::new: 要求Lambda體只有一句語句并且是用來創建一個對象,構造方法的形參列表和返回值(構造器對應類的對象)要與接口中抽象方法一致才可以替換

  • Supplier中的T get()和Employee的無參構造方法Employee()

  • Function中的R apply(T t)和Employee的有參構造方法Employee(id)

  • BiFunction中的R apply(T t,U u)和Employee的有參構造方法Employee(id,name)

@Test
public void test1(){// 傳統寫法Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};System.out.println("*******************");// Lambda表達式Supplier<Employee>  sup1 = () -> new Employee();System.out.println(sup1.get());System.out.println("*******************");// 構造器引用Supplier<Employee>  sup2 = Employee :: new;System.out.println(sup2.get());
}@Test
public void test2(){// Lambda表達式Function<Integer,Employee> func1 = id -> new Employee(id);Employee employee = func1.apply(1001);System.out.println(employee);System.out.println("*******************");// 構造器引用Function<Integer,Employee> func2 = Employee :: new;Employee employee1 = func2.apply(1002);System.out.println(employee1);}@Test
public void test3(){// Lambda表達式BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);System.out.println(func1.apply(1001,"Tom"));System.out.println("*******************");// 構造器引用BiFunction<Integer,String,Employee> func2 = Employee :: new;System.out.println(func2.apply(1002,"Tom"));}

數組構造引用

數組類型名[]::new: 要求Lambda體只有一條語句并且是創建一個數組對象,接口中抽象方法的形參接收的是數組對象的長度

  • Function中的R apply(T t)和String[]
@Test
public void test4(){// Lambda表達式Function<Integer,String[]> func1 = length -> new String[length];String[] arr1 = func1.apply(5);System.out.println(Arrays.toString(arr1));System.out.println("*******************");// 數組引用Function<Integer,String[]> func2 = String[] :: new;String[] arr2 = func2.apply(10);System.out.println(Arrays.toString(arr2));}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164018.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164018.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164018.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小紅書關鍵詞搜索商品列表API接口(分類ID搜索商品數據接口,商品詳情接口)演示案例

通過關鍵詞搜索商品API接口&#xff0c;電商平臺可以為消費者提供一個簡單、快捷的商品搜索功能。用戶只需輸入關鍵詞&#xff0c;就可以得到與該關鍵詞相關的商品列表。關鍵詞搜索商品API接口還可以提供給第三方開發者一個便捷的商品搜索服務。開發者可以利用該接口&#xff0…

Mac安裝配置typescript及在VSCode上運行ts

一、Mac上安裝typescript sudo npm install -g typescript 測試一下&#xff1a;出現Version則證明安裝成功 tsc -v 二、在VSCode上運行 新建一個xxx.ts文件&#xff0c;測試能否運行 console.log("helloworld") 運行報錯&#xff1a;ts-node: command not…

后滲透持久性-– 服務控制管理器

執行以下命令將快速檢索服務控制管理器實用程序的 SDDL 權限。 sc sdshow scmanager服務控制管理器 – 安全描述符 PowerShell 還可用于枚舉所有用戶組的 SDDL 權限并將其轉換為可讀格式。 $SD Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Schedule\S…

shell 條件語句 if case

目錄 測試 test測試文件的表達式 是否成立 格式 選項 比較整數數值 格式 選項 字符串比較 常用的測試操作符 格式 邏輯測試 格式 且 &#xff08;全真才為真&#xff09; 或 &#xff08;一真即為真&#xff09; 常見條件 雙中括號 [[ expression ]] 用法 &…

美國服務器在大陸連不上怎么回事?

?  在租用任何美國服務器之前&#xff0c;都需要先搞清楚一些使用問題&#xff0c;畢竟服務器能夠不間斷地訪問也是站在們所期望的。但有時&#xff0c;美國服務器網站或許也會突然出現在大陸打不開的情況&#xff0c;在面臨這種情況時&#xff0c;我們應該怎么做? 查看連不…

【史上最細教程】服務器MySQL數據庫完成主從復制

文章目錄 MySQL完成主從復制教程準備&#xff1a;原理&#xff1a;步驟&#xff1a; 推薦文章 MySQL完成主從復制教程 主從復制&#xff08;也稱 AB 復制&#xff09;就是將一個服務器&#xff08;主服務器&#xff09;的數據復制到一個或多個MySQL數據庫服務器&#xff08;從…

Java飛翔的鳥

創建三個包&#xff0c;存放代碼。把圖片放進文件中 APP包&#xff08;運行&#xff09; GameApp類 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包&#xff08;主內容&#xff09; Barri…

python獲取json所有節點和子節點

使用python獲取json的所有父結點和子節點 并使用父節點加下劃線命名子節點 先展示一段json代碼 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

電力行業的智能調度:數字孿生技術

隨著科技的發展&#xff0c;數字孿生技術正逐漸滲透到各個行業領域&#xff0c;其中包括電力行業。數字孿生技術為電力行業帶來了前所未有的機遇&#xff0c;使得電力系統的運行更加高效、安全和可持續。本文借用山海鯨可視化軟件幾個電力行業數字孿生案例探討數字孿生技術在電…

介紹幾種Go語言開發的IDE

文章目錄 1.前言2.幾種ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.總結寫在最后 1.前言 Go語言作為一種新興的編程語言&#xff0c;近年來受到了越來越多的關注。 它以其簡潔、高效和并發性能而聞名&#xff0c;被廣…

Jmeter 壓測保姆級入門教程

1、Jmeter本地安裝 1.1、下載安裝 軟件下載地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 選擇一個壓縮包下載即可 然后解壓縮后進入bin目錄直接執行命令jmeter即可啟動 1.2 修改語言 默認是英文的&#xff0c;修改中文&#xff0c;點擊…

關于解決C# WinForm中Chart控件增刪數據時報錯的解決方法

1.報錯代碼 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能無法執行枚舉操作。具體報錯表現為,在Application.Run(Form1())中斷。 2.解決方法 這個錯誤通常是由于在枚舉集合時對集合進行了修改而引起的。在修改完chart控件中的內容后,可能會…

Linux---常用命令匯總

文章目錄 關于目錄操作的命令ls/llcdpwdmkdir 關于文件操作的命令touchechocatrmmvcpvim 關于查詢操作的命令greppsnetstat 關于目錄操作的命令 ls/ll ls : 列出當前目錄下的目錄和文件&#xff08;以行的展示形式&#xff09; ll &#xff1a; 列出當前目錄下的目錄和文件&…

Django之Cookie與Session,CBV加裝飾器

前言 會話跟蹤技術 在一個會話的多個請求中共享數據&#xff0c;這就是會話跟蹤技術。例如在一個會話中的請求如下&#xff1a; ? 請求銀行主頁&#xff1b; 請求登錄&#xff08;請求參數是用戶名和密碼&#xff09;&#xff1b;請求轉賬&#xff08;請求參數與轉賬相關的數…

Thread類常用成員方法

點擊鏈接返回標題-> Java線程的學習-CSDN博客 目錄 前言 有關線程名字的成員方法&#xff1a; String getName() void setName(String name) Thread(String name) 獲取線程對象的成員方法&#xff1a; static Thread currentThread() 讓線程睡眠的成員方法&#xff1…

時間序列分析算法的概念、模型檢驗及應用

時間序列分析是一種用于研究隨時間變化的數據模式和趨勢的統計方法。這類數據通常按照時間順序排列&#xff0c;例如股票價格、氣溫、銷售額等。時間序列分析的目標是從過去的觀測中提取信息&#xff0c;以便預測未來的趨勢。 以下是關于時間序列分析的一些重要概念、模型檢驗…

python 數據類型之集合

常見的數據類型&#xff1a; int&#xff0c;整數類型&#xff08;整形&#xff09;bool&#xff0c;布爾類型str&#xff0c;字符串類型list&#xff0c;列表類型tuple&#xff0c;元組類型dict&#xff0c;字典類型&#xff0c;一個容器且元素必須是鍵值對。set&#xff0c;…

I Doc View在線文檔預覽系統RCE漏洞(QVD-2023-45061)

0x01 產品簡介 iDocView是一個在線文檔解析應用&#xff0c;旨在提供便捷的文件查看和編輯服務。 0x02 漏洞概述 漏洞成因 本次漏洞出現在在線文檔解析應用中的遠程頁面緩存功能。具體問題在于該應用未能對用戶輸入的URL進行充分的安全驗證&#xff0c;從而導致存在安全隱患…

前端實現菜單快速檢索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

紅隊攻防實戰之內網穿透隱秘隧道搭建

別低頭&#xff0c;皇冠會掉&#xff1b;別流淚&#xff0c;賤人會笑。 本文首發于先知社區&#xff0c;原創作者即是本人 0x00 前言 構建內網隱蔽通道&#xff0c;從而突破各種安全策略限制&#xff0c;實現對目標服務器的完美控制。 當我們從外網成功獲得攻擊點的時候&…