日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java8方法引用符合_java8,方法引用

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8方法引用符合_java8,方法引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當我們使用lambda表達式去創建一個匿名方法時,有時我們并沒有做什么事情,僅僅是使用了對象中一個存在的方法。這種情況下,通過對象的方法名就能夠很明顯的推斷出要使用 的方法,java8中的方法引用能夠做到這一點。

首先創建一個Person對象。

public classPerson {public enumSex {

MALE, FEMALE

}

String name;

LocalDate birthday;

Sex gender;

String emailAddress;public intgetAge() {//...

}publicCalendar getBirthday() {returnbirthday;

}public static intcompareByAge(Person a, Person b) {returna.birthday.compareTo(b.birthday);

}}

然后有一組person對象,想通過生日進行排序,那么傳統的方法是,實現Comparator接口

Person[] rosterAsArray = roster.toArray(newPerson[roster.size()]);class PersonAgeComparator implements Comparator{public intcompare(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

Arrays.sort(rosterAsArray,newPersonAgeComparator());

調用的sort方法如下,傳入數組和 實現了Comparator的對象

static void sort(T[] a, Comparator super T> c)

因為Comparator接口是一個函數式接口,所以可以用lambda表達式代替實現了Comparator接口的類對象。

Arrays.sort(rosterAsArray,

(Person a, Person b)->{returna.getBirthday().compareTo(b.getBirthday());

}

);

然而匿名方法是根據生日對Person進行排序,這種方法功能已經在Person類中存在,所以我們可以直接使用lambda表達式調用

Arrays.sort(rosterAsArray,

(a, b)->Person.compareByAge(a, b)

);

因為lambda表達式調用存在的方法,可以使用方法應用代替lambda表達式

Arrays.sort(rosterAsArray, Person::compareByAge);

參數列表從與引用方法參數一致,JRE能夠推斷出方法參數類型,是(Person, Person)

方法體是Person.compareByAge,這樣提高了方法的重用性

引用的方法包括:靜態方法,實例方法,特定類型的任意對象方法引用,構造方法引用

KindExample

Reference to a static method

ContainingClass::staticMethodName

Reference to an instance method of a particular object

containingObject::instanceMethodName

Reference to an instance method of an arbitrary object of a particular type

ContainingType::methodName

Reference to a constructor

ClassName::new

引用靜態方法,如上面例子所示

Person::compareByAge

引用實例方法,創建實例,就可以應用對象中的任意方法

classComparisonProvider {public intcompareByName(Person a, Person b) {returna.getName().compareTo(b.getName());

}public intcompareByAge(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

ComparisonProvider myComparisonProvider= newComparisonProvider();

Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);

特定類型的任意對象方法引用,例如String,和上面引用幾乎相同,只是應用于基本數據類型等

String[] stringArray = { "Barbara", "James", "Mary", "John","Patricia", "Robert", "Michael", "Linda"};

Arrays.sort(stringArray, String::compareToIgnoreCase);

引用構造方法

public static , DEST extends Collection>DEST transferElements(

SOURCE sourceCollection,

SuppliercollectionFactory) {

DEST result=collectionFactory.get();for(T t : sourceCollection) {

result.add(t);

}returnresult;

}

函數式接口Supplier能夠調用無參構造函數,返回一個對象,

Set rosterSetLambda =transferElements(roster, ()-> { return new HashSet<>(); });

也可以使用構造方法引用代替lambda表達式,構造對象

Set rosterSet = transferElements(roster, HashSet::new);

JAVA編譯器能夠推斷出你想創建一個容器,所以可以指定容器包含的類型,如下

Set rosterSet = transferElements(roster, HashSet::new);

總結

以上是生活随笔為你收集整理的java8方法引用符合_java8,方法引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。