摘要:陳楊一測試數(shù)據(jù)準(zhǔn)備二方法引用引入方法引用集合遍歷集合遍歷集合遍歷集合遍歷三什么是
package com.java.design.java8.MethodReference; import com.java.design.java8.entity.Student; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Arrays; import java.util.List; import java.util.function.Supplier; /** * @author 陳楊 */ @RunWith(SpringRunner.class) @SpringBootTest public class MethodReference {一、測試數(shù)據(jù)準(zhǔn)備
private List二、方法引用 引入students; private List snames; private Student studentSupplier(Supplier studentSupplier) { return studentSupplier.get(); } // private StudentConstructor studentConstructor = // (id, name, sex, age, addr, salary) -> // new Student(id, name, sex, age, addr, salary); private StudentConstructor studentConstructor = Student::new; private Student studentAllArgs(Integer id, String name, String sex, Integer age, String addr, Double salary) { return studentConstructor.studentAllArgs(id, name, sex, age, addr, salary); } @Before public void init() { Student kirito = new Student(1, "Kirito", "Male", 18, "Sword Art Online", 999999999.0); Student Asuna = new Student(2, "Asuna", "Female", 17, "Sword Art Online", 999999999.0); Student Sinon = new Student(3, "Sinon", "Female", 16, "Gun Gale Online", 999999999.0); Student Yuuki = new Student(4, "Yuuki", "Female", 15, "Alfheim Online", 999999999.0); Student Alice = new Student(5, "Alice", "Female", 14, "Alicization", 999999999.0); students = Arrays.asList(kirito, Asuna, Sinon, Yuuki, Alice); snames = Arrays.asList("kirito", "Asuna", "Sinon", "Yuuki", "Alice"); }
@Test public void testMethodReference() { // MethodReference 方法引用 List三、什么是方法引用Iloveyou = Arrays.asList("Kirito", "Love", "Asuna"); //集合遍歷 Lambda System.out.println("--------------------------------------- "); System.out.println("集合遍歷 Lambda"); Iloveyou.forEach(str -> System.out.println(str)); //集合遍歷 MethodReference System.out.println("--------------------------------------- "); System.out.println("集合遍歷 MethodReference"); Iloveyou.forEach(System.out::println);
// MethodReference // 方法引用是Lambda表達(dá)式的特殊替換 // 方法引用本質(zhì)是一個 函數(shù)指針 Function Pointer // 這個指針指向被引用方法 // eg: 方法引用System.out::println 指向System.out.println()這個函數(shù)四、方法引用的分類
1、 靜態(tài)方法引用
// 1、 靜態(tài)方法引用 // 靜態(tài)方法引用 類名::靜態(tài)方法名 // 靜態(tài)方法引用 功能實現(xiàn)等價于 調(diào)用 類的靜態(tài)方法 // 靜態(tài)方法引用 與 調(diào)用 無任何關(guān)系 // 類名.靜態(tài)方法名 -->方法調(diào)用 顯示傳參 // 類名::靜態(tài)方法名 -->方法引用 隱式傳參 編譯器自動推斷 方法引用的表達(dá)式 函數(shù)指針 指向 被引用函數(shù) System.out.println("--------------------------------------- "); System.out.println(" 靜態(tài)方法引用 按年齡排序"); students.sort(StaticStudentComparator::staticCompareStudentByAge); students.forEach(System.out::println); System.out.println("--------------------------------------- "); System.out.println(" 靜態(tài)方法引用 按姓名排序"); students.sort(StaticStudentComparator::staticCompareStudentByName); students.forEach(System.out::println);
2、 對象實例方法引用
// 2、 對象實例方法引用 // 對象實例方法引用 引用名(對象名)::實例方法名 // 對象實例方法引用 功能實現(xiàn)等價于 調(diào)用 對象實例 所擁有的 實例方法 StudentComparator studentComparator = new StudentComparator(); System.out.println("--------------------------------------- "); System.out.println(" 靜態(tài)方法引用 按年齡排序"); students.sort(studentComparator::compareStudentByAge); students.forEach(System.out::println); System.out.println("--------------------------------------- "); System.out.println(" 對象實例方法引用 按姓名排序"); students.sort(studentComparator::compareStudentByName); students.forEach(System.out::println);
3、 類實例方法引用
// 3、 類實例方法引用 // 類實例方法引用 類名::實例方法名 System.out.println("--------------------------------------- "); System.out.println(" 類實例方法引用 按年齡排序"); students.sort(Student::classCompareStudentByAge); students.forEach(System.out::println); System.out.println("--------------------------------------- "); System.out.println(" 類實例方法引用 按姓名排序"); students.sort(Student::classCompareStudentByName); students.forEach(System.out::println); System.out.println("--------------------------------------- "); System.out.println(" 類實例方法引用 容易理解的 字符串排序"); snames.sort(String::compareToIgnoreCase); snames.forEach(System.out::println);
4、 構(gòu)造方法引用
// 4、 構(gòu)造方法引用 // 構(gòu)造方法引用 類名::new // 注意: 實體類Student 事先 有定義好的 全參構(gòu)造方法 與無參構(gòu)造方法 // 若沒有構(gòu)造方法 需要自行添加 否則報錯 // Student::new 可以根據(jù)參數(shù)不同 對構(gòu)造方法進(jìn)行自動識別 重載 // 利用無參構(gòu)造方法構(gòu)造studentNoArgs對象 System.out.println("--------------------------------------- "); System.out.println("利用無參構(gòu)造方法構(gòu)造studentNoArgs對象"); Student studentNoArgs = this.studentSupplier(Student::new); System.out.println(studentNoArgs); // 利用自定義全參構(gòu)造方法構(gòu)造student對象 System.out.println("--------------------------------------- "); System.out.println("利用全參構(gòu)造方法構(gòu)造studentNoArgs對象"); Student Silica = this.studentAllArgs (6, "Silica", "Female", 10, "Sword Art Online", 999999999.0); System.out.println(Silica); } }五、StaticStudentComparator類 (靜態(tài)方法實例引用)
import com.java.design.java8.entity.Student; import java.util.Comparator; public class StaticStudentComparator { static Comparator六、StudentComparator類 (對象方法實例引用)studentAgeComparator = (first, last) -> first.getAge() - last.getAge(); static Comparator studentNameComparator = (first, last) -> first.getName().compareToIgnoreCase(last.getName()); public static int staticCompareStudentByAge(Student first, Student last) { return studentAgeComparator.compare(first, last); } public static int staticCompareStudentByName(Student first, Student last) { return studentNameComparator.compare(first, last); } }
import com.java.design.java8.entity.Student; import java.util.Comparator; public class StudentComparator { Comparator七、StudentConstructor @FunctionalInterface接口 (構(gòu)造方法實例引用)studentAgeComparator = (first, last) -> first.getAge() - last.getAge(); Comparator studentNameComparator = (first, last) -> first.getName().compareToIgnoreCase(last.getName()); public int compareStudentByAge(Student first, Student last) { return studentAgeComparator.compare(first, last); } public int compareStudentByName(Student first, Student last) { return studentNameComparator.compare(first, last); } }
import com.java.design.java8.entity.Student; @FunctionalInterface public interface StudentConstructor { Student studentAllArgs(Integer id, String name, String sex, Integer age, String addr, Double salary); }八 、Student實體類 (類實例方法引用)
@Data @AllArgsConstructor @NoArgsConstructor public class Student { private Integer id; private String name; private String sex; private Integer age; private String addr; private Double salary; public int classCompareStudentByAge(Student student) { return this.getAge() - student.getAge(); } public int classCompareStudentByName(Student student) { return this.getName().compareToIgnoreCase(student.getName()); } }九、 測試結(jié)果
. ____ _ __ _ _ / / ___"_ __ _ _(_)_ __ __ _ ( ( )\___ | "_ | "_| | "_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) " |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.2.RELEASE) 2019-02-02 17:04:20.851 INFO 16876 --- [ main] c.j.d.j.MethodReference.MethodReference : Starting MethodReference on DESKTOP-87RMBG4 with PID 16876 (started by 46250 in E:IdeaProjectsdesign) 2019-02-02 17:04:20.852 INFO 16876 --- [ main] c.j.d.j.MethodReference.MethodReference : No active profile set, falling back to default profiles: default 2019-02-02 17:04:21.422 INFO 16876 --- [ main] c.j.d.j.MethodReference.MethodReference : Started MethodReference in 0.878 seconds (JVM running for 1.682) --------------------------------------- 集合遍歷 Lambda Kirito Love Asuna --------------------------------------- 集合遍歷 MethodReference Kirito Love Asuna --------------------------------------- 靜態(tài)方法引用 按年齡排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) --------------------------------------- 靜態(tài)方法引用 按姓名排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) --------------------------------------- 靜態(tài)方法引用 按年齡排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) --------------------------------------- 對象實例方法引用 按姓名排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) --------------------------------------- 類實例方法引用 按年齡排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) --------------------------------------- 類實例方法引用 按姓名排序 Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8) Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8) Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8) Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8) Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8) --------------------------------------- 類實例方法引用 容易理解的 字符串排序 Alice Asuna kirito Sinon Yuuki --------------------------------------- 利用無參構(gòu)造方法構(gòu)造studentNoArgs對象 Student(id=null, name=null, sex=null, age=null, addr=null, salary=null) --------------------------------------- 利用全參構(gòu)造方法構(gòu)造studentNoArgs對象 Student(id=6, name=Silica, sex=Female, age=10, addr=Sword Art Online, salary=9.99999999E8)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77392.html
摘要:寫在前面最近在看實戰(zhàn)感覺這本書的排版紙質(zhì)內(nèi)容真的都超級棒個人覺得這本書還是很值得一讀本文簡單或詳細(xì)介紹一下的和表達(dá)式函數(shù)式接口是在才開始引入的首先看一下普通接口和函數(shù)式接口的區(qū)別普通接口指的是一些具有相同屬性和行為的類的抽象函數(shù)式接口也是同 寫在前面: 最近在看,感覺這本書的排版,紙質(zhì),內(nèi)容真的都超級棒,個人覺得這本書還是很值得一讀.本文簡單或詳細(xì)介紹一下Java8的Functiona...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來跟清晰了。這是由泛型接口內(nèi)部實現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來因?qū)Σ粩嘧兓男枨螅詈笪覀円彩褂玫搅薒ambda,通過表達(dá)式為我們簡化了很多代碼從而極大地提高了我們的...
摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計模式之單例模式 - 掘金前言 作為一個好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過程中不免會去閱讀源碼,這也是一個優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過程中很多人會遇到的障礙,那就是設(shè)計模式。很多優(yōu)秀的框架會運(yùn)...
摘要:在那里,可以理解為指針。局部變量不能夠被訪問控制符及修飾都可以被修飾變量的傳遞與語言相似調(diào)用對象方法時要傳遞參數(shù)。內(nèi)部類內(nèi)部類是所在類的成員。大體上相當(dāng)于其他語言的匿名函數(shù)或函數(shù)指針。 1. 變量及其傳遞 基本類型變量(primitive type)和引用類型變量(reference type) 基本類型(primitive type):其值直接存于變量中。在這里 引用型(refer...
閱讀 2788·2023-04-25 14:41
閱讀 2383·2021-11-23 09:51
閱讀 3678·2021-11-17 17:08
閱讀 1675·2021-10-18 13:31
閱讀 5545·2021-09-22 15:27
閱讀 917·2019-08-30 15:54
閱讀 2226·2019-08-30 13:16
閱讀 735·2019-08-29 17:04