摘要:注解與注解的作用類似,中專門為函數(shù)式接口引入了一個新的注解。函數(shù)式編程是沒有副作用的,最大的好處就是函數(shù)的內(nèi)部是無狀態(tài)的,既輸入確定輸出就確定。函數(shù)式編程還有更多好玩的套路,這就需要靠大家自己探索了。
前言
在上一篇Lambda的講解中我們就提到過函數(shù)式接口,比如:Consumer
有且只有一個抽象方法的接口被稱為函數(shù)式接口,函數(shù)式接口適用于函數(shù)式編程的場景,Lambda就是Java中函數(shù)式編程的體現(xiàn),可以使用Lambda表達式創(chuàng)建一個函數(shù)式接口的對象,一定要確保接口中有且只有一個抽象方法,這樣Lambda才能順利的進行推導(dǎo)。
@FunctionalInterface注解與@Override 注解的作用類似,Java 8中專門為函數(shù)式接口引入了一個新的注解:@FunctionalInterface 。該注解可用于一個接口的定義上,一旦使用該注解來定義接口,編譯器將會強制檢查該接口是否確實有且僅有一個抽象方法,否則將會報錯。但是這個注解不是必須的,只要符合函數(shù)式接口的定義,那么這個接口就是函數(shù)式接口。
static方法和default方法實在不知道該在哪介紹這兩個方法了,所以就穿插在這里了。
java8中為接口新增了一項功能,定義一個或者多個靜態(tài)方法。用法和普通的static方法一樣,例如:
public interface Interface { /** * 靜態(tài)方法 */ static void staticMethod() { System.out.println("static method"); } }
注意:實現(xiàn)接口的類或者子接口不會繼承接口中的靜態(tài)方法。
java8在接口中新增default方法,是為了在現(xiàn)有的類庫中中新增功能而不影響他們的實現(xiàn)類,試想一下,如果不增加默認(rèn)實現(xiàn)的話,接口的所有實現(xiàn)類都要實現(xiàn)一遍這個方法,這會出現(xiàn)兼容性問題,如果定義了默認(rèn)實現(xiàn)的話,那么實現(xiàn)類直接調(diào)用就可以了,并不需要實現(xiàn)這個方法。default方法怎么定義?
public interface Interface { /** * default方法 */ default void print() { System.out.println("hello default"); } }
注意:如果接口中的默認(rèn)方法不能滿足某個實現(xiàn)類需要,那么實現(xiàn)類可以覆蓋默認(rèn)方法。不用加default關(guān)鍵字,例如:
public class InterfaceImpl implements Interface { @Override public void print() { System.out.println("hello default 2"); } }
在函數(shù)式接口的定義中是只允許有一個抽象方法,但是可以有多個static方法和default方法。
自定義函數(shù)式接口按照下面的格式定義,你也能寫出函數(shù)式接口:
@FunctionalInterface 修飾符 interface 接口名稱 { 返回值類型 方法名稱(可選參數(shù)信息); // 其他非抽象方法內(nèi)容 }
雖然@FunctionalInterface注解不是必須的,但是自定義函數(shù)式接口最好還是都加上,一是養(yǎng)成良好的編程習(xí)慣,二是防止他人修改,一看到這個注解就知道是函數(shù)式接口,避免他人往接口內(nèi)添加抽象方法造成不必要的麻煩。
@FunctionalInterface public interface MyFunction { void print(String s); }
看上圖是我自定義的一個函數(shù)式接口,那么這個接口的作用是什么呢?就是輸出一串字符串,屬于消費型接口,是模仿Consumer接口寫的,只不過這個沒有使用泛型,而是將參數(shù)具體類型化了,不知道Consumer沒關(guān)系,下面會介紹到,其實java8中提供了很多常用的函數(shù)式接口,Consumer就是其中之一,一般情況下都不需要自己定義,直接使用就好了。那么怎么使用這個自定義的函數(shù)式接口呢?我們可以用函數(shù)式接口作為參數(shù),調(diào)用時傳遞Lambda表達式。如果一個方法的參數(shù)是Lambda,那么這個參數(shù)的類型一定是函數(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í)行以后就會輸出“試試自定義函數(shù)好使不”這句話,如果某天需求變了,我不想輸出這句話了,想輸出別的,那么直接替換text就好了。函數(shù)式編程是沒有副作用的,最大的好處就是函數(shù)的內(nèi)部是無狀態(tài)的,既輸入確定輸出就確定。函數(shù)式編程還有更多好玩的套路,這就需要靠大家自己探索了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75470.html
摘要:前言系列神秘的系列神奇的函數(shù)式接口繼上兩篇之后,本文已經(jīng)系列的第三篇了。相反,他們會返回一個持有結(jié)果的新。操作是延遲執(zhí)行的。截斷流,使其元素不超過給定數(shù)量。返回流中元素總數(shù)。返回流中最大值。 前言 「Java8系列」神秘的Lambda「Java8系列」神奇的函數(shù)式接口繼上兩篇之后,本文已經(jīng)java8系列的第三篇了。本篇文章比較長,但我希望大家都能認(rèn)真讀完。讀不完可以先收藏,在找時間讀。...
摘要:引入了與此前完全不同的函數(shù)式編程方法,通過表達式和來為下的函數(shù)式編程提供動力。命令式編程語言把對象變量和流轉(zhuǎn)當(dāng)作一等公民,而函數(shù)式編程在此基礎(chǔ)上加入了策略變量這一新的一等公民。 Java8引入了與此前完全不同的函數(shù)式編程方法,通過Lambda表達式和StreamAPI來為Java下的函數(shù)式編程提供動力。本文是Java8新特性的第一篇,旨在闡釋函數(shù)式編程的本義,更在展示Java是如何通...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達式改進后或者是不得不承認(rèn),代碼看起來跟清晰了。這是由泛型接口內(nèi)部實現(xiàn)方式造成的。 # Lambda表達式在《Java8實戰(zhàn)》中第三章主要講的是Lambda表達式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來因?qū)Σ粩嘧兓男枨螅詈笪覀円彩褂玫搅薒ambda,通過表達式為我們簡化了很多代碼從而極大地提高了我們的...
摘要:上一篇我們詳細(xì)介紹了函數(shù)式接口中主要的一些方法使用,本篇介紹的雖然并不是一個函數(shù)式接口,但是也是一個極其重要的類。并不是我們之前介紹的一系列函數(shù)式接口,它是一個,主要作用就是解決中的。 上一篇我們詳細(xì)介紹了Predicate函數(shù)式接口中主要的一些方法使用,本篇介紹的Optional雖然并不是一個函數(shù)式接口,但是也是一個極其重要的類。 Optional并不是我們之前介紹的一系列函數(shù)式接口...
摘要:一表達式匿名內(nèi)部類最大的問題在于其冗余的語法,比如前面的中五行代碼僅有一行是在執(zhí)行任務(wù)。總結(jié)基于詞法作用域的理念,表達式不可以掩蓋任何其所在上下文的局部變量。 轉(zhuǎn)載請注明出處:https://zhuanlan.zhihu.com/p/20540175 在介紹Lambda表達式之前,我們先來看只有單個方法的Interface(通常我們稱之為回調(diào)接口): public interface...
閱讀 2101·2021-11-18 10:02
閱讀 2850·2021-09-04 16:41
閱讀 1142·2019-08-30 15:55
閱讀 1405·2019-08-29 17:27
閱讀 1068·2019-08-29 17:12
閱讀 2535·2019-08-29 15:38
閱讀 2855·2019-08-29 13:02
閱讀 2831·2019-08-29 12:29