成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

「java8系列」神奇的函數(shù)式接口

DevTTL / 1779人閱讀

摘要:注解與注解的作用類(lèi)似,中專(zhuān)門(mén)為函數(shù)式接口引入了一個(gè)新的注解。函數(shù)式編程是沒(méi)有副作用的,最大的好處就是函數(shù)的內(nèi)部是無(wú)狀態(tài)的,既輸入確定輸出就確定。函數(shù)式編程還有更多好玩的套路,這就需要靠大家自己探索了。

前言

在上一篇Lambda的講解中我們就提到過(guò)函數(shù)式接口,比如:Consumer consumer = (s) -> System.out.println(s);其中Consumer就是一個(gè)函數(shù)式接口。這里是通過(guò)Lambda表達(dá)式創(chuàng)建了一個(gè)函數(shù)式接口的對(duì)象。如果不知道什么是Lambda,請(qǐng)看《神秘的Lambda》。

函數(shù)式接口是什么?

有且只有一個(gè)抽象方法的接口被稱(chēng)為函數(shù)式接口,函數(shù)式接口適用于函數(shù)式編程的場(chǎng)景,Lambda就是Java中函數(shù)式編程的體現(xiàn),可以使用Lambda表達(dá)式創(chuàng)建一個(gè)函數(shù)式接口的對(duì)象,一定要確保接口中有且只有一個(gè)抽象方法,這樣Lambda才能順利的進(jìn)行推導(dǎo)。

@FunctionalInterface注解

與@Override 注解的作用類(lèi)似,Java 8中專(zhuān)門(mén)為函數(shù)式接口引入了一個(gè)新的注解:@FunctionalInterface 。該注解可用于一個(gè)接口的定義上,一旦使用該注解來(lái)定義接口,編譯器將會(huì)強(qiáng)制檢查該接口是否確實(shí)有且僅有一個(gè)抽象方法,否則將會(huì)報(bào)錯(cuò)。但是這個(gè)注解不是必須的,只要符合函數(shù)式接口的定義,那么這個(gè)接口就是函數(shù)式接口。

static方法和default方法

實(shí)在不知道該在哪介紹這兩個(gè)方法了,所以就穿插在這里了。

static方法:

java8中為接口新增了一項(xiàng)功能,定義一個(gè)或者多個(gè)靜態(tài)方法。用法和普通的static方法一樣,例如:

public interface Interface {
    /**
     * 靜態(tài)方法
     */
    static void staticMethod() {
        System.out.println("static method");
    }
}

注意:實(shí)現(xiàn)接口的類(lèi)或者子接口不會(huì)繼承接口中的靜態(tài)方法。

default方法:

java8在接口中新增default方法,是為了在現(xiàn)有的類(lèi)庫(kù)中中新增功能而不影響他們的實(shí)現(xiàn)類(lèi),試想一下,如果不增加默認(rèn)實(shí)現(xiàn)的話(huà),接口的所有實(shí)現(xiàn)類(lèi)都要實(shí)現(xiàn)一遍這個(gè)方法,這會(huì)出現(xiàn)兼容性問(wèn)題,如果定義了默認(rèn)實(shí)現(xiàn)的話(huà),那么實(shí)現(xiàn)類(lèi)直接調(diào)用就可以了,并不需要實(shí)現(xiàn)這個(gè)方法。default方法怎么定義?

public interface Interface {
    /**
     * default方法
     */
    default void print() {
        System.out.println("hello default");
    }
}

注意:如果接口中的默認(rèn)方法不能滿(mǎn)足某個(gè)實(shí)現(xiàn)類(lèi)需要,那么實(shí)現(xiàn)類(lèi)可以覆蓋默認(rèn)方法。不用加default關(guān)鍵字,例如:

public class InterfaceImpl implements Interface {
    @Override
    public  void print() {
        System.out.println("hello default 2");
    }
}

在函數(shù)式接口的定義中是只允許有一個(gè)抽象方法,但是可以有多個(gè)static方法和default方法。

自定義函數(shù)式接口

按照下面的格式定義,你也能寫(xiě)出函數(shù)式接口:

 @FunctionalInterface
 修飾符 interface 接口名稱(chēng) {
    返回值類(lèi)型 方法名稱(chēng)(可選參數(shù)信息);
    // 其他非抽象方法內(nèi)容
 }

雖然@FunctionalInterface注解不是必須的,但是自定義函數(shù)式接口最好還是都加上,一是養(yǎng)成良好的編程習(xí)慣,二是防止他人修改,一看到這個(gè)注解就知道是函數(shù)式接口,避免他人往接口內(nèi)添加抽象方法造成不必要的麻煩。

@FunctionalInterface
public interface MyFunction {
    void print(String s);
}

看上圖是我自定義的一個(gè)函數(shù)式接口,那么這個(gè)接口的作用是什么呢?就是輸出一串字符串,屬于消費(fèi)型接口,是模仿Consumer接口寫(xiě)的,只不過(guò)這個(gè)沒(méi)有使用泛型,而是將參數(shù)具體類(lèi)型化了,不知道Consumer沒(méi)關(guān)系,下面會(huì)介紹到,其實(shí)java8中提供了很多常用的函數(shù)式接口,Consumer就是其中之一,一般情況下都不需要自己定義,直接使用就好了。那么怎么使用這個(gè)自定義的函數(shù)式接口呢?我們可以用函數(shù)式接口作為參數(shù),調(diào)用時(shí)傳遞Lambda表達(dá)式。如果一個(gè)方法的參數(shù)是Lambda,那么這個(gè)參數(shù)的類(lèi)型一定是函數(shù)式接口。例如:

public class MyFunctionTest {
    public static void main(String[] args) {
        String text = "試試自定義函數(shù)好使不";
        printString(text, System.out::print);
    }

    private static void printString(String text, MyFunction myFunction) {
        myFunction.print(text);
    }
}

執(zhí)行以后就會(huì)輸出“試試自定義函數(shù)好使不”這句話(huà),如果某天需求變了,我不想輸出這句話(huà)了,想輸出別的,那么直接替換text就好了。函數(shù)式編程是沒(méi)有副作用的,最大的好處就是函數(shù)的內(nèi)部是無(wú)狀態(tài)的,既輸入確定輸出就確定。函數(shù)式編程還有更多好玩的套路,這就需要靠大家自己探索了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75470.html

相關(guān)文章

  • java8系列」流編程Stream

    摘要:前言系列神秘的系列神奇的函數(shù)式接口繼上兩篇之后,本文已經(jīng)系列的第三篇了。相反,他們會(huì)返回一個(gè)持有結(jié)果的新。操作是延遲執(zhí)行的。截?cái)嗔?,使其元素不超過(guò)給定數(shù)量。返回流中元素總數(shù)。返回流中最大值。 前言 「Java8系列」神秘的Lambda「Java8系列」神奇的函數(shù)式接口繼上兩篇之后,本文已經(jīng)java8系列的第三篇了。本篇文章比較長(zhǎng),但我希望大家都能認(rèn)真讀完。讀不完可以先收藏,在找時(shí)間讀。...

    bovenson 評(píng)論0 收藏0
  • Ummm... Java8和lambda

    摘要:引入了與此前完全不同的函數(shù)式編程方法,通過(guò)表達(dá)式和來(lái)為下的函數(shù)式編程提供動(dòng)力。命令式編程語(yǔ)言把對(duì)象變量和流轉(zhuǎn)當(dāng)作一等公民,而函數(shù)式編程在此基礎(chǔ)上加入了策略變量這一新的一等公民。 Java8引入了與此前完全不同的函數(shù)式編程方法,通過(guò)Lambda表達(dá)式和StreamAPI來(lái)為Java下的函數(shù)式編程提供動(dòng)力。本文是Java8新特性的第一篇,旨在闡釋函數(shù)式編程的本義,更在展示Java是如何通...

    LMou 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第三章讀書(shū)筆記(Lambda表達(dá)-01)

    摘要:之前,使用匿名類(lèi)給蘋(píng)果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來(lái)跟清晰了。這是由泛型接口內(nèi)部實(shí)現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實(shí)戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來(lái)因?qū)Σ粩嘧兓男枨?,最后我們也使用到了Lambda,通過(guò)表達(dá)式為我們簡(jiǎn)化了很多代碼從而極大地提高了我們的...

    longshengwang 評(píng)論0 收藏0
  • Java8-7-Optional類(lèi)詳解

    摘要:上一篇我們?cè)敿?xì)介紹了函數(shù)式接口中主要的一些方法使用,本篇介紹的雖然并不是一個(gè)函數(shù)式接口,但是也是一個(gè)極其重要的類(lèi)。并不是我們之前介紹的一系列函數(shù)式接口,它是一個(gè),主要作用就是解決中的。 上一篇我們?cè)敿?xì)介紹了Predicate函數(shù)式接口中主要的一些方法使用,本篇介紹的Optional雖然并不是一個(gè)函數(shù)式接口,但是也是一個(gè)極其重要的類(lèi)。 Optional并不是我們之前介紹的一系列函數(shù)式接口...

    wemallshop 評(píng)論0 收藏0
  • Java8新特性第1章(Lambda表達(dá))

    摘要:一表達(dá)式匿名內(nèi)部類(lèi)最大的問(wèn)題在于其冗余的語(yǔ)法,比如前面的中五行代碼僅有一行是在執(zhí)行任務(wù)??偨Y(jié)基于詞法作用域的理念,表達(dá)式不可以掩蓋任何其所在上下文的局部變量。 轉(zhuǎn)載請(qǐng)注明出處:https://zhuanlan.zhihu.com/p/20540175 在介紹Lambda表達(dá)式之前,我們先來(lái)看只有單個(gè)方法的Interface(通常我們稱(chēng)之為回調(diào)接口): public interface...

    ningwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<