在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

函數式接口的應用知識點

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-13 11:32 ? 次閱讀

概述

函數式接口將分為三個篇章來為大家介紹:

  • (應用篇一)(1)函數式接口的來源,(2)Lambda表達式,(3)雙冒號運算符
  • (應用篇二)(4)詳細介紹@FunctionInterface注解(5)對java.util.function包進行解讀
  • (原理篇)介紹函數式接口的實現原理 應用篇將階段相關的JDK源碼以及給出典型的示例代碼 原理篇則從編譯、JVM維度來分析函數式接口的實現原理,具有一定深度,需要讀者具備一定的底層知識。

說明:源碼使用的版本為JDK-11.0.11

FunctionInterface

這一節,指北君給大家介紹如何聲明一個函數式接口,FunctionInterface注解就是用于來干這件事情的,當我們為接口增加FunctionInterface注解后,編譯器會按照函數式接口的約束進行檢查。先看看注解的定義:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

源碼顯示該注解可用于類、接口和枚舉類型,注解應用于運行時階段。

如果僅從代碼層面我們可能會犯錯誤,比如如下情況:

@FunctionalInterface
public interface IFuncInterfaceSample{
  void func1();
  void func2();
}

我們會發現編譯器報錯了,這是因為在設計FunctionInterface的時候還增加了額外的約束,這些約束無法在注解的定義中呈現,是通過編譯器實現的,下面指北君就一一為小伙伴們道來。

首先、FunctionInterface是SAM接口,什么是SAM接口呢?全稱Single Abstract Method,從英文字義我們就能明白,接口中只能有一個抽象方法。由于Java在接口中增加了對默認方法和靜態方法的支持,因此采用SAM設計的接口也可以定義默認方法和靜態方法,也就是說我們在使用了FunctionInterface注解的接口中還能夠定義默認方法和靜態方法。除了默認方法和靜態方法外,這里還有一種列外,我們查看java.util.Comparator源碼

@FunctionalInterface
public interface Comparator< T > {
    int compare(T o1, T o2);
    boolean equals(Object obj);
    ...

咦,這怎么回事,不是說只能有一個抽象方法么?小伙伴們仔細觀察接口會發現其中一個是equals接口,這不是Object中的方法么?是的,這就是另一條特殊的約束,如果抽象方法是覆蓋的是Object的方法,則不計入抽象方法的個數。

除了抽象方法的個數限制外FunctionInterface只能用于interface,不能用于class和enum,對于這種情形編譯器也會報錯。

小伙伴們有沒想過FunctionInterface為什么要有上面提到的約束呢?相信有些已經隱隱感覺到了:Java是通過類來實現函數式編程的(這部分內容將在原理篇中說明)。

最后,還有一個重點知識:是不是只有使用了@FunctionalInterface才能作為函數式接口呢?相信有不少伙伴和指北君之前一樣理所當然地覺得顯然應該是這樣嘛。但是,JDK的世界很精妙:只要符合函數式接口約束條件的接口,即使沒有采用@FunctionalInterface,編譯器都會處理成函數式接口,比如下面的示例代碼:

public interface IFuncInterfaceWithoutAn {
  boolean test(int i);
}

public class Demo {
  public static void main(String args[]) {
    IFuncInterfaceWithoutAn whithout = (x)- >x%2==1;
    System.out.println(whithout.test(3));
  }
}

java.util.function

之前的學習,指北君介紹了什么是函數式編程,如果寫一段Lambda表達式,以及學習如何申明函數式接口。本節我們將學習JDK為我們提供的基礎函數式接口,這些接口位于java.util.function包中,它們可以滿足我們很多通用場景的使用需要。

圖片
function包

打開java.util.function包,我們發現里面足足有43個接口,這43個接口就是JDK提供給我們43把劍,如果要讓小伙伴舞動這43把劍,是不是感覺鴨梨山大了呢?小伙伴們,別慌!在你看完指北君后面的分析后,你就可以將這43把劍化為無形,做到手中無劍心中有劍。

指北君先帶領小伙伴們對接口名稱進行分析。是的,是接口名稱,不是源碼

圖片
接口名稱解析

從思維導圖中可以看到,接口的主體為最后的單詞,包含:Consumer,Function,Predicate,Supplier,Operator。

圖片
接口主體類別

除了主體外,小伙伴是不是還看到了Unary,Binary,Bi這種表示參數個數的修飾詞。

修飾詞作用
Unary一元
Binary二元
BiBinary縮寫

再就剩下參數類型和方向的修飾詞和參數方向Int,Long,Double,Obj,(X)To(Y)。

通過以上解析,我們可以確定所有的接口都是用于描述函數的輸入參數和返回,這就是java.util.function留在我們心中終極大劍。有了這把終極武器,我們可以對于這43把劍信手拈來,也隨意創造自己的武器,當然,要創造新的武器,按照這43把劍依葫蘆畫瓢是可以,但是要打造精品武器還需要掌握我們接下來介紹的FunctionInterface接口了。

在對整個java.util.function包了然于胸后,我們再打開一個典型的接口看看源碼。function包中的類型都為接口類型,并且使用了@FunctionInterface注解,且每個接口都且只有一個接口(抽象)方法,部分接口存在默認方法和靜態方法。

@FunctionalInterface
public interface Consumer< T > {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);

    /**
     * Returns a composed {@code Consumer} that performs, in sequence, this
     * operation followed by the {@code after} operation. If performing either
     * operation throws an exception, it is relayed to the caller of the
     * composed operation.  If performing this operation throws an exception,
     * the {@code after} operation will not be performed.
     *
     * @param after the operation to perform after this operation
     * @return a composed {@code Consumer} that performs in sequence this
     * operation followed by the {@code after} operation
     * @throws NullPointerException if {@code after} is null
     */
    default Consumer< T > andThen(Consumer< ? super T > after) {
        Objects.requireNonNull(after);
        return (T t) - > { accept(t); after.accept(t); };
    }
}

accept為核心接口方法,andThen為方便復雜組合場景提供的默認方法。function包的整個代碼邏輯都很簡潔易懂,部分Operator繼承了Function,指北君就不一一贅述了。

小結

至此,函數式接口的應用知識點已經介紹和分析完,涵蓋知識點包含:java.util.function包,FunctionInterface注解,Lambda表達式,雙冒號操作符等知識點。函數式接口在集合,流中應用較為廣泛,也證明了其在數據時候的顯著優勢,各位小伙伴可以結合這些JDK中的源碼進行鞏固加深。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8694

    瀏覽量

    151927
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29458
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62977
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69056
  • JDK
    JDK
    +關注

    關注

    0

    文章

    82

    瀏覽量

    16637
收藏 人收藏

    評論

    相關推薦

    嵌入C語言知識點總結

    怎么才能做好嵌入開發?學好C語言吧!今天就來推薦一篇大佬寫的嵌入C語言知識點總結。
    發表于 09-27 09:53 ?1205次閱讀

    嵌入內存管理的知識點總結

    任何程序運行起來都需要分配內存空間存放該進程的資源信息的,C程序也不例外。C程序中的變量、常量、函數、代碼等等的信息所存放的區域都有所不同,不同的區域又有不同的特性。C語言學習者、尤其是在學習嵌入的朋友,這些知識點一定要吃透!
    發表于 08-17 09:33 ?563次閱讀
    嵌入<b class='flag-5'>式</b>內存管理的<b class='flag-5'>知識點</b>總結

    嵌入C/單片機C/標準C知識點

    :嵌入C、標準C、單片機C區別  知識點2:程序組成和程序原則  知識點3:變量類型(函數、數組、指針、結構體等類型)  知識點4:常用的
    發表于 10-24 14:42

    工程師總結了一些C語言的知識點

    僅供大家參考,想一起和我討論嗎,可以加一下我的QQ2685896890,黃老師一、嵌入C/單片機C/標準C知識點知識點1:嵌入C、標準C、單片機C區別知識點2:程序組成和程序原則
    發表于 07-25 10:23

    【信盈達】C語言知識點的總結

    一、嵌入C/單片機C/標準C知識點知識點1:嵌入C、標準C、單片機C區別知識點2:程序組成和程序原則知識點3:變量類型(
    發表于 10-08 14:41

    STM32外部中斷知識點概述

    STM32外部中斷概述知識點(1)知識點(2)知識點(3)中斷服務函數外部中斷常用庫函數外部中斷的一般配置步驟
    發表于 08-16 07:43

    C語言程序小知識點總結

    C語言總結(stm32嵌入開發)文章目錄C語言總結(stm32嵌入開發)c程序小知識點總結1.靜態變量static與外部變量extern的使用2.函數封裝后返回值的方法3.軟件寄存
    發表于 11-05 07:45

    RK3399 HDMI接口知識點匯總,絕對實用

    RK3399 HDMI接口知識點匯總,絕對實用
    發表于 03-07 06:53

    高一數學知識點總結

    高一數學知識點總結高一數學知識點總結高一數學知識點總結
    發表于 02-23 15:27 ?0次下載

    液晶屏知識點培訓

    液晶屏知識點液晶屏分辨率等,液晶屏接口
    發表于 01-01 08:00 ?42次下載

    PWM知識點詳解

    PWM知識點
    發表于 03-16 08:00 ?44次下載

    嵌入知識點總結

    嵌入知識點總結(arm嵌入開發led過程)-嵌入知識點總結? ? ? ? ? ? ? ? ? ??
    發表于 07-30 14:20 ?23次下載
    嵌入<b class='flag-5'>式</b><b class='flag-5'>知識點</b>總結

    數字電路知識點總結

    本文整理了數字電路課程中的相關基本的知識點和較為重要的知識點,用于求職的數電部分的知識準備,差缺補漏。
    的頭像 發表于 05-30 15:07 ?5043次閱讀
    數字電路<b class='flag-5'>知識點</b>總結

    什么是函數接口

    、及其所使用的一些和函數接口相關的知識點進行一個全面的學習。函數
    的頭像 發表于 10-13 14:48 ?1594次閱讀
    什么是<b class='flag-5'>函數</b><b class='flag-5'>式</b><b class='flag-5'>接口</b>

    接口測試理論、疑問收錄與擴展相關知識點

    本文章使用王者榮耀游戲接口、企業微信接口的展示結合理論知識,講解什么是接口測試、接口測試理論、疑問收錄與擴展相關
    的頭像 發表于 11-15 09:12 ?389次閱讀
    <b class='flag-5'>接口</b>測試理論、疑問收錄與擴展相關<b class='flag-5'>知識點</b>
    主站蜘蛛池模板: 爱爱小视频免费看 | 天天操天天操天天干 | 亚洲最大的成网4438 | 天天操天天插 | 牛牛a级毛片在线播放 | 国产精品久久久久久久免费大片 | 1024手机免费看 | 色姑娘天天干 | 国产成人精品亚洲日本在线观看 | 国产色噜噜 | 中文字幕在线观看一区二区三区 | h小视频在线观看网 | 精品国产免费人成高清 | 亚洲成av人影片在线观看 | 色屋视频| 色视频在线网站 | 日本国产在线 | se综合 | 天天做天天爱夜夜想毛片 | 五月婷婷六月丁香综合 | 看片久久 | 欧美电影一区二区三区 | 小屁孩cao大人免费网站 | 69色视频 | 午夜在线视频观看版 | 老师叫我下面含着精子去上课 | 亚洲一二 | 你懂的国产 | 婷婷色在线观看 | 美女免费视频黄 | 欧美日韩在线一本卡 | 91pao强力打造免费高清 | 欧美一级别 | 插吧插吧综合网 | 成人夜夜 | 欧美性色视频 | h网站在线播放 | 嘿嘿午夜 | 精品一区二区三区免费毛片爱 | 国模私拍一区二区三区 | aaaaaaa欧美黄色大片 |