溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在java8中對(duì)函數(shù)進(jìn)行引用

發(fā)布時(shí)間:2020-12-05 15:31:19 來(lái)源:億速云 閱讀:186 作者:Leah 欄目:編程語(yǔ)言

怎么在java8中對(duì)函數(shù)進(jìn)行引用?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

函數(shù)引用的類(lèi)型

函數(shù)引用分為以下四種:

  • 靜態(tài)函數(shù),比如 Integer 類(lèi)的 parseInt 函數(shù),可以寫(xiě)作 Integer::parseInt
  • 對(duì)象級(jí)別函數(shù)的引用,比如 String 類(lèi)的 length 函數(shù),可以寫(xiě)作 String::length
  • 具體實(shí)例的函數(shù)的引用,比如名稱(chēng)為 expensiveTransaction 的一個(gè)實(shí)例的 getValue,寫(xiě)作 expensiveTransaction::getValue
  • 構(gòu)造函數(shù)的引用

靜態(tài)函數(shù)

比如:

Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);

可以寫(xiě)作:

Function<String, Integer> stringToInteger = Integer::parseInt;

對(duì)象級(jí)別函數(shù)的引用

BiPredicate<List<String>, String> contains =
(list, element) -> list.contains(element);

可以寫(xiě)作:

BiPredicate<List<String>, String> contains = List::contains;

構(gòu)造函數(shù)的引用

下面再舉一個(gè)構(gòu)造函數(shù)的例子, 首先定義一個(gè)函數(shù)式接口,唯一的方法 get 返回指定類(lèi)型的對(duì)象。

@FunctionalInterface
public interface Supplier<T> {
 T get();
}
Supplier<TantanitReader> constructor = () -> new TantanitReader();
TantanitReader tantanitReader = constructor.get();

上述代碼的 lambda 表達(dá)式 new 并返回一個(gè)新的對(duì)象,使得 constructor 變量成為一個(gè)構(gòu)造器的引用。

等價(jià)于以下函數(shù)引用:

Supplier<TantanitReader> constructor2 = TantanitReader::new;
TantanitReader tantanitReader2 = constructor2.get();

以上的例子都是沒(méi)有參數(shù)的情況,下面仍然以構(gòu)造函數(shù)為例,介紹有參數(shù)的情況:

public TantanitReader(String loginName) {
 this.loginName = loginName;
}
Function<String,TantanitReader> constructor3 = (loginName) -> new TantanitReader(loginName);
TantanitReader tantanitReader3 = constructor3.apply("jack");

Function<String,TantanitReader> constructor4 = TantanitReader::new;
TantanitReader tantanitReader4 = constructor4.apply("jack");
TantanitReader tantanitReader5 = constructor4.apply("tom");

這時(shí)由于函數(shù)只有一個(gè)參數(shù),可以使用 Java 自帶的 Function這個(gè)函數(shù)式接口,它實(shí)際起作用的函數(shù)如下:

R apply(T t);

作用為根據(jù)一個(gè)參數(shù),返回一個(gè)結(jié)果。我們由此可以使用 constructor4 以及相應(yīng)的函數(shù)引用 constructor5。

小結(jié)

使用函數(shù)引用不僅可以簡(jiǎn)化 lambda 表達(dá)式,而且在語(yǔ)義上可以更加專(zhuān)注于方法名稱(chēng),也就是要做的事,抽象級(jí)別更加接近人類(lèi)的認(rèn)知。所以,應(yīng)當(dāng)盡可能使用函數(shù)引用。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI