java8——lambed表達式

行為參數(shù)化的3中方式(策略模式)

  1. 匿名類
  2. lamada

函數(shù)式接口

函數(shù)式接口就是只定義一個抽象方法的接口。

Lambda表達式允許你直接內(nèi)聯(lián)掘托,為函數(shù)式接口的抽象方法提供實現(xiàn),并且將整個表達式座位函數(shù)式接口的一個實例跑筝。

java.util.function包中引入了的函數(shù)式接口

  1. Predicate
Interface Predicate<T>

Type Parameters:
T - the type of the input to the predicate

Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

抽象方法:

boolean test(T t)
Evaluates this predicate on the given argument.

Predicate<T>接口定義了一個名叫test的抽象方法,接收泛型T對象,返回一個boolean站欺。

public class Main {

    public static void main(String[] args) {
        Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
        filter(listOfString, nonEmptyStringPredicate);
    }

    public static <T> List<T> filter(List<T> list, Predicate<T> p){
        List<T> results = new ArrayList<T>();
        for(T s : list){
            if(p.test(s)){
                results.add(s);
            }
        }
        return results;
    }
}
  1. Consumer
Interface Consumer<T>

Type Parameters:
T - the type of the input to the operation

All Known Subinterfaces:
Stream.Builder<T>

Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

抽象方法

void    accept(T t)
Performs this operation on the given argument.

Consumer<T>定義了一個名叫accept的抽象方法蜻懦,它接受泛型T對象甜癞,沒有返回(void)。如果需要訪問類型T的對象阻肩,并對其執(zhí)行某些操作带欢,就可以使用這個接口。

  public static <T> void forEach(List<T> list,Consumer<T> consumer){
        for(T i:list){
            consumer.accept(i);
        }
    }
    
   forEach(Arrays.asList(1,2,3,4,5),(Integer i) -> System.out.println(i));
  1. Interface Function<T,R>
Type Parameters:
T - the type of the input to the function
R - the type of the result of the function

All Known Subinterfaces:
UnaryOperator<T>

Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

抽象方法:

R   apply(T t)
Applies this function to the given argument.

Function<T,R>接口定義了一個叫做apply的方法烤惊,它接受一個泛型T的對象乔煞,并返回一個泛型R的對象。如果要定義一個lambda柒室,將輸入對象的信息映射到輸出渡贾,就可以使用這個接口。

  public static <T,R> List<R> map(List<T> list, Function<T,R> f){
            List<R> result = new ArrayList<>();
            for(T s:list){
                result.add(f.apply(s));
            }
            return  result;
    }
    
 List<Integer> l = map(Arrays.asList("lambdas","in","action"),(String s)->s.length());
    }

異常雄右,lambda空骚,還有函數(shù)式接口

任何函數(shù)式接口都不允許拋出受檢異常(checked exception).如果需要Lambda表達式來拋出異常,有兩種辦法:

  1. 定義字一個自己的函數(shù)式接口擂仍,并聲明受檢異常囤屹。
  2. 把lambda包在一個try/catch中。
@FunctionalInterface
public interface BufferedReaderProcessor{
    String process(BufferdReader b) throws IOException
}
Function<BufferedReader,String> f = (BufferedReader b) ->{
    try{
        return b.readLine();
    }catch(IOException e){
        throw new RuntimeException(e);
    }
}

Lambda表達式使用局部變量

lambda表達式不僅能用到主體里的函數(shù)逢渔。還允許使用自有變量(不是參數(shù)肋坚,而是在外層作用域中定義的變量),就像匿名類一樣肃廓。他們被稱作捕獲Lambda

int portNumber = 1337;
Runable r = () -> System.out.println(portNumber);

但是,Lambda可以沒有限制的捕獲(也就是在其主題中引用)實例變量和靜態(tài)變量智厌。但是局部變量必須顯示的聲明為final。

閉包

Lambda和匿名類可以做類似于閉包的事情:他們可以作為參數(shù)傳遞給方法盲赊,并且可以訪問其作用域之外的變量铣鹏。但是有一個顯示:他們不能修改定義Lambda的方法的局部變量的內(nèi)容。

方法引用

先前

inventory.sort((Apple a1,Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));

之后(使用方法引用后java.util.Comparator.compareing):

inventory.sort(comparing(Apple::getWeight))

如何構(gòu)建方法引用:方法引用主要有3類

  1. 指向靜態(tài)方法的方法引用(例如Integer的parseInt方法)寫作Integer::parseInt
  2. 指向任意類型實例方法的方法引用(例如String的length方法,寫作String::length)
  3. 指向現(xiàn)有對象的實例方法的方法引用(假設(shè)你有一個局部變量expensiveTransaction用于存放Transaaction類型的對象哀蘑,他支持實例方法getValue诚卸,那么你就可以寫expensiveTransaction::getValue)。


    image

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

對于一個現(xiàn)有的構(gòu)造函數(shù)递礼,可以利用它的名稱和關(guān)鍵字new來創(chuàng)建它的一個引用:ClassName::new惨险。它的功能與指向靜態(tài)方法的引用類似。列入脊髓,假設(shè)有一個構(gòu)造函數(shù)沒有參數(shù)。它適合Supplier的簽名()->Apple栅受。

Suppier<Apple> c1 = Apple::new;
Apple a1 = c1.get();

這就等價于:

Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();

如果構(gòu)造函數(shù)的簽名是Apple(Integer weight),那么它就適合Function接口的簽名将硝,于是你可以這樣寫:

Function<Integer,Apple> c2 = Apple::new;
Apple a2 = c2.apply(110);

等價于:

Function<Integer,Apple> c2 = (weight) ->new Apple(weight);
Apple a2 = c2.apply(110);

謂詞復(fù)合

謂詞接口包括三個方法:negate恭朗,and和or,讓你可以重用已有的Predicatre來創(chuàng)建更復(fù)雜的謂詞。


image

函數(shù)復(fù)合

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末依疼,一起剝皮案震驚了整個濱河市痰腮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌律罢,老刑警劉巖膀值,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異误辑,居然都是意外死亡沧踏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門巾钉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翘狱,“玉大人,你說我怎么就攤上這事砰苍×市伲” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵赚导,是天一觀的道長茬缩。 經(jīng)常有香客問我,道長吼旧,這世上最難降的妖魔是什么凰锡? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮黍少,結(jié)果婚禮上寡夹,老公的妹妹穿的比我還像新娘。我一直安慰自己厂置,他們只是感情好菩掏,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昵济,像睡著了一般智绸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上访忿,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天瞧栗,我揣著相機與錄音,去河邊找鬼海铆。 笑死迹恐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卧斟。 我是一名探鬼主播殴边,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼憎茂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锤岸?” 一聲冷哼從身側(cè)響起竖幔,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎是偷,沒想到半個月后拳氢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蛋铆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年馋评,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戒职。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡栗恩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洪燥,到底是詐尸還是另有隱情磕秤,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布捧韵,位于F島的核電站市咆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏再来。R本人自食惡果不足惜蒙兰,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芒篷。 院中可真熱鬧搜变,春花似錦、人聲如沸针炉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篡帕。三九已至殖侵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镰烧,已是汗流浹背拢军。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怔鳖,地道東北人茉唉。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赌渣。 傳聞我的和親對象是個殘疾皇子魏铅,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 簡介 概念 Lambda 表達式可以理解為簡潔地表示可傳遞的匿名函數(shù)的一種方式:它沒有名稱昌犹,但它有參數(shù)列表坚芜、函數(shù)主...
    劉滌生閱讀 3,207評論 5 18
  • lambda表達式(又被成為“閉包”或“匿名方法”)方法引用和構(gòu)造方法引用擴展的目標類型和類型推導(dǎo)接口中的默認方法...
    183207efd207閱讀 1,486評論 0 5
  • 前言 人生苦多,快來 Kotlin 斜姥,快速學(xué)習(xí)Kotlin鸿竖! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,217評論 9 118
  • Java8 in action 沒有共享的可變數(shù)據(jù)铸敏,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,235評論 1 2
  • 聲明:本文翻譯自The Java? Tutorials(官方文檔) 簡述 匿名類有一個問題缚忧,如果匿名類的實現(xiàn)非常簡...
    猴子小皮球閱讀 4,668評論 0 9