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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例

發(fā)布時(shí)間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java方法示例注釋 @

函數(shù)接口是Java 8最重要的概念之一,實(shí)際上為lambda表達(dá)式提供了動力,但是許多開發(fā)人員沒有首先了解函數(shù)接口在Java 8中的作用就花了很多精力來理解它,并花時(shí)間學(xué)習(xí)lambda表達(dá)式和Stream API。除非您知道什么是功能接口以及l(fā)ambda與它之間的關(guān)系,否則您將無法使用Java 8的強(qiáng)大功能,例如lambda表達(dá)式和流API 。 沒有功能接口的知識,您將無法理解在代碼中可以使用lambda的位置,但是您將很難編寫該方法期望的lambda表達(dá)式,因此,對功能接口有一個(gè)很好的了解非常重要。 Java 8。

在本文中,我將通過解釋什么是函數(shù)接口,什么是@Functional注釋,它們與lambda表達(dá)式之間的關(guān)系以及它們?nèi)绾螏椭诖a中使用lambda表達(dá)式來填補(bǔ)這一空白。 那么,讓我們從第一件事開始,什么是功能接口?

Java 8中的功能接口是什么

好吧,一個(gè)功能接口不過是帶有一個(gè)抽象方法的接口,例如Comparable , Runnable , EventListener , Comparator等。您可以看到這些接口甚至在JDK 8之前就已經(jīng)存在于Java中,但是為什么我們將這種接口稱為功能接口呢?

這是一個(gè)很好的問題,如果您對函數(shù)式編程有所了解,就知道它可以傳遞代碼,即函數(shù),就像將數(shù)據(jù)或?qū)ο髠鬟f給方法一樣。
這些接口只有一種抽象方法被用于傳遞代碼,就像您以函數(shù)式編程語言傳遞函數(shù)一樣, 這就是為什么它們被稱為函數(shù)接口 。

例如,您可以通過實(shí)現(xiàn)Comparator接口來創(chuàng)建一個(gè)Anonymous類,從而直接傳遞代碼以比較對象,如下所示:

Collections.sort(list, new Comparator(){public int compare(String s1, String s2){return s1.length() - s2.length();}});

因此,如果仔細(xì)觀察,您會發(fā)現(xiàn)我們正在使用這些接口將代碼傳遞給函數(shù) 。 它們也稱為策略接口,因?yàn)檫@是策略模式的一種實(shí)現(xiàn),其中將構(gòu)成策略的代碼注入到在運(yùn)行時(shí)運(yùn)行該策略的代碼中。

順便說一句,如果您不知道什么是策略模式,那么我建議您從0轉(zhuǎn)到1:設(shè)計(jì)模式–至關(guān)重要的24 –在Java中 ,因?yàn)樵O(shè)計(jì)模式的知識對于Java的有效編碼很重要。

因此,既然我們知道什么是功能接口,讓我們了解它們與lambda表達(dá)式之間的關(guān)系 ,以及對功能接口的理解對于使用lambda表達(dá)式編寫代碼有何重要性?

好吧,最重要的是要記住的是,Java中l(wèi)ambda表達(dá)式的唯一用途是將它們轉(zhuǎn)換為功能接口。

這意味著如果方法接受函數(shù)接口 , 則可以傳遞lambda表達(dá)式 ,這進(jìn)一步意味著,可以將lambda傳遞給所有接受方法的現(xiàn)有方法
Comparator , Runnable或任何只有一個(gè)抽象方法的任何其他接口。

這就是Java中的lambda表達(dá)式也被稱為SAM類型的原因,其中SAM表示單一抽象方法。

@Functional注釋有什么作用?

現(xiàn)在,讓我們看看@Functional注釋是做什么的? 如果僅在其上方添加@Functional注釋,它將使接口起作用嗎? 好吧,不,它不會那樣做。 實(shí)際上,
可選的 。

這意味著您可以在不使用@Functioanl批注的情況下創(chuàng)建功能接口,就像可以在不將@Override批注放在方法頂部的情況下@Override方法一樣。 那么, @Functional批注的真正目的是什么?

好吧,它可以確保該接口實(shí)際上只有一種抽象方法,并且還向諸如Javadoc之類的工具提供了此接口是功能性接口的提示。 它與@Override批注非常相似,它通過驗(yàn)證您實(shí)際上是重寫方法來幫助防止人為錯(cuò)誤。

與@Override相似,它的最佳做法是使用單個(gè)抽象方法將@Functional批注放在方法頂部,以向Javadoc等工具指示它們是功能接口。

用@Functional注釋對java.util.function包中添加的所有新功能接口進(jìn)行注釋。

順便說一句,是的,我們在JDK 8中提供了更多的功能接口,特別是通用功能接口,例如Predicate , Supplier , Consumer , Function , BiFunction , UnaryOperator等。請參見
Java 8:初學(xué)者的基礎(chǔ)知識,可深入了解所有這些接口。

這些功能接口允許您以lambda表達(dá)式的形式將代碼傳遞給函數(shù),并允許創(chuàng)建可以對這些代碼進(jìn)行操作的強(qiáng)大方法,例如
filter()接受謂詞,并允許您傳遞接受一個(gè)參數(shù)并返回布爾值的代碼。

功能接口和Lamda表達(dá)式如何關(guān)聯(lián)

功能接口的知識如何影響lambda表達(dá)式的編寫? 好吧,除非您不了解功能接口,否則您將無法編寫可轉(zhuǎn)換為該功能接口的lambda表達(dá)式。

例如, java.util.Map接口的merge()方法接受BiFunction,但是如果您不知道什么是BiFunction,則無法為此編寫lambda。

BiFunction是一個(gè)功能接口,具有一個(gè)接受兩個(gè)參數(shù)T和U并返回對象R的方法。

這意味著您可以將lambda傳遞給此方法,該方法可處理兩個(gè)參數(shù)并返回一個(gè)對象,例如merge(key, value, (v1, v2) -> v1 + v2)這里(v1, V2) -> v1 + v2是一個(gè)lambda表達(dá)式,可以將其轉(zhuǎn)換為BiFunction功能接口的實(shí)例。

一個(gè)更簡單的示例是Predicate ,它接受類型T并返回一個(gè)布爾值。 如果您看Stream類的filter()方法,它將接受一個(gè)謂詞:

filter(Predicate predicate)

這意味著您可以傳遞任何接受一個(gè)參數(shù)的lambda表達(dá)式,然后將布爾值返回給該方法,例如age -> age > 15 or s -> s.length == 15 ,這兩個(gè)都可以接受,但是如果您不知道什么是a謂詞接口,那么您將無法做到這一點(diǎn)。

功能接口的另一個(gè)示例是Consumer ,它接受類型T的參數(shù)且不返回任何內(nèi)容。 JDK 8中Iterable的forEach()方法很好地利用了這一點(diǎn),如下所示:

forEach(Consumer action)

您會看到forEach()接受了Consumer,這意味著您可以向其傳遞一個(gè)lambda表達(dá)式,該表達(dá)式具有一個(gè)參數(shù),不返回任何內(nèi)容或返回空值,例如

s -> System.out.println(s)

代碼System.out.println()返回任何內(nèi)容,它僅在控制臺中打印行。

您可以看到,如果您知道功能接口,則可以輕松編寫一個(gè)lambda表達(dá)式來傳遞,因此必須對功能接口有充分的了解。 我建議您遍歷java.util.function包中的所有功能接口并了解它們。

我將在以后的文章java.util.function包中的一些更復(fù)雜的功能接口,但是如果您迫不及待,那么我建議您學(xué)習(xí)此Java 9 Master Class課程,以了解有關(guān)Lambda和其他Java的更多信息。 8個(gè)概念。

這就是Java中的功能接口 。 您還了解了@Functional批注的作用,以及為什么要在Java 8的代碼中有效使用lambda表達(dá)式需要對功能接口有充分的了解。如果您尚未開始使用Java 8,建議您這樣做。現(xiàn)在它是因?yàn)樵谖磥韼啄曛?#xff0c;每個(gè)人都將使用Java 8進(jìn)行編碼,如果您不知道lambda表達(dá)式和Java 8中引入的新功能,那么您將被拋在后面。

其他Java 8教程和參考資料,供進(jìn)一步學(xué)習(xí)

Java 8的新增功能:Lambdas

如何使用Lambda按鍵和值對HashMay進(jìn)行排序?

如何在Java 8中使用map和flatMap?

如何在Java 8中進(jìn)行Map Reduce?

如何在Java 8中將lambda表達(dá)式轉(zhuǎn)換為方法引用?

Java SE 8新功能–完整指南

感謝您到目前為止閱讀本文。 如果您喜歡我對Functional接口和@Functional注釋的解釋,請與您的朋友和同事分享。 如果您有任何問題或反饋,請發(fā)表評論。

翻譯自: https://www.javacodegeeks.com/2018/01/functional-interface-java-8-functional-annotation-examples.html

java方法示例注釋 @

總結(jié)

以上是生活随笔為你收集整理的java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。