關(guān)于JAVA 8 lambda的一些事兒

lambda是一個(gè)匿名的函數(shù)宝剖,可以將它作為參數(shù)傳遞或者返回一個(gè)lambda,當(dāng)提到lambda就不得不提到Functional Interfaces.

那么什么是Functional Interfaces笤喳?

我們首先看下java.util.function這個(gè)package得糜,這里面都是java提供給我們的Functional Interface,他們都是注解了@FunctionalInterface

從java提供的package中症概,我們發(fā)現(xiàn)要想自定義一個(gè)實(shí)現(xiàn)lambda功能的Interface伪节,首先要使用@FunctionalInterface注解這個(gè)Interface光羞。實(shí)際上只要自定義的Interface只有一個(gè)abstract(未實(shí)現(xiàn))的方法時(shí),我們都可以不用添加@FunctionalInterface這個(gè)注解怀大。

但是我們?cè)谝粋€(gè)project中纱兑,建議還是添加這個(gè)@FunctionalInterface來表示這個(gè)Interface是一個(gè)Functional的,同時(shí)也可以避免往這個(gè)Interface里面誤添加其他的abstract方法化借,如果你使用@FunctionalInterface注解的話潜慎,會(huì)報(bào)編譯錯(cuò)誤(Functional只支持一個(gè)abstract方法)

Lambda就是代替了Inner class嗎?

從之前的實(shí)現(xiàn)和使用Lambda的實(shí)現(xiàn)來看蓖康,看起來確實(shí)像是代替了Inner class铐炫,但是lambda和Inner class他們有不同的scope。

  • Inner class:enclosing scope(括號(hào))可以定義同名字的局部變量覆蓋成員變量蒜焊,this關(guān)鍵字是指向Inner class的
  • lambda:enclosing scope(括號(hào))是不可以覆蓋外面的變量倒信,this指向class的

另外lambda作為一個(gè)純函數(shù),理論上是不允許修改外部的state的泳梆,所以外部的變量是不可以改變(final)鳖悠,但不一定非得定義final,換一個(gè)詞語是"effectively final"优妙,只被賦值了一次的乘综。如果lambda內(nèi)檢測(cè)到賦值了多次,會(huì)報(bào)編譯錯(cuò)誤套硼。但是在某些情況下卡辰,他有可以修改,如:

int[] total = new int[1];
Runnable r = () -> total[0]++;
r.run();

這段代碼是合法的邪意,沒有報(bào)錯(cuò)九妈,total變量確實(shí)是"effectively final"的,在lambda內(nèi)沒有對(duì)他進(jìn)行重新賦值雾鬼,但是我們對(duì)他內(nèi)部的值進(jìn)行了修改C戎臁!呆贿!在以后的編碼中一定要避免上述代碼的出現(xiàn)

JAVA 8中常用的幾種FunctionalInterface

  1. Functions: 接收一個(gè)參數(shù)嚷兔,返回另外一個(gè)值。另外如果要接收兩個(gè)參數(shù)做入,一般Interface要包含"Bi"關(guān)鍵詞冒晰,比如BiFunction,ToDoubleBiFunction竟块,ToIntBiFunction...

    @FunctionalInterface
    public interface Function<T, R> {
         R apply(T t);
        ...
    }
    
    //例子:
    Map<String, Integer> nameMap = new HashMap<>();
    Integer value = nameMap.computeIfAbsent("John", s -> s.length());
    //或者換種寫法
    Integer value = nameMap.computeIfAbsent("John", String::length);
    
  2. Suppliers: 不需要接收參數(shù)壶运,但是要返回一個(gè)值

    @FunctionalInterface
    public interface Supplier<T> {
        T get();
      
    //例子:
    public double squareLazy(Supplier<Double> lazyValue) {
        return Math.pow(lazyValue.get(), 2);
    }
      
    Supplier<Double> lazyValue = () -> {
        Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);
        return 9d;
    };
     
    Double valueSquared = squareLazy(lazyValue);
    
  3. Consumers: 和Suppliers相反,接收一個(gè)參數(shù)浪秘,但是不返回

    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
             ...
    }
    
    
    //例子:
    List<String> names = Arrays.asList("John", "Freddy", "Samuel");
    names.forEach(name -> System.out.println("Hello, " + name));
    
  4. Predicates: 接收一個(gè)參數(shù)蒋情,返回一個(gè)boolean值

    @FunctionalInterface
    public interface Predicate<T> {
        boolean test(T t);
         ...
    }
    
    //例子
    List<String> names = Arrays.asList("Angela", "Aaron", "Bob", "Claire", "David");
     
    List<String> namesWithA = names.stream()
      .filter(name -> name.startsWith("A"))
      .collect(Collectors.toList());
    
  5. Operators: 接收參數(shù)和返回值,是同一個(gè)類型耸携。它是一個(gè)特殊的Function類型的interface

    @FunctionalInterface
    public interface UnaryOperator<T> extends Function<T, T> {
        static <T> UnaryOperator<T> identity() {
            return t -> t;
        }
    
    //例子
    List<String> names = Arrays.asList("bob", "josh", "megan");
     
    names.replaceAll(name -> name.toUpperCase());
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棵癣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夺衍,更是在濱河造成了極大的恐慌狈谊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沟沙,死亡現(xiàn)場(chǎng)離奇詭異河劝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矛紫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門赎瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颊咬,你說我怎么就攤上這事务甥。” “怎么了贪染?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缓呛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我杭隙,道長(zhǎng)哟绊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任痰憎,我火速辦了婚禮票髓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铣耘。我一直安慰自己洽沟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜗细。 她就那樣靜靜地躺著裆操,像睡著了一般怒详。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪区,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天昆烁,我揣著相機(jī)與錄音,去河邊找鬼缎岗。 笑死静尼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的传泊。 我是一名探鬼主播鼠渺,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼眷细!你這毒婦竟也來了拦盹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤溪椎,失蹤者是張志新(化名)和其女友劉穎掌敬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體池磁,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奔害,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了地熄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片华临。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖端考,靈堂內(nèi)的尸體忽然破棺而出雅潭,到底是詐尸還是另有隱情,我是刑警寧澤却特,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布扶供,位于F島的核電站,受9級(jí)特大地震影響裂明,放射性物質(zhì)發(fā)生泄漏椿浓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一闽晦、第九天 我趴在偏房一處隱蔽的房頂上張望扳碍。 院中可真熱鬧,春花似錦仙蛉、人聲如沸笋敞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夯巷。三九已至赛惩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁餐,已是汗流浹背坊秸。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澎怒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓阶牍,卻偏偏與公主長(zhǎng)得像喷面,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子走孽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 本文是在學(xué)習(xí)和使用kotlin時(shí)的一些總結(jié)與體會(huì)惧辈,一些代碼示例來自于網(wǎng)絡(luò)或Kotlin官方文檔,持續(xù)更新... 對(duì)...
    竹塵居士閱讀 3,286評(píng)論 0 8
  • lambda表達(dá)式(又被成為“閉包”或“匿名方法”)方法引用和構(gòu)造方法引用擴(kuò)展的目標(biāo)類型和類型推導(dǎo)接口中的默認(rèn)方法...
    183207efd207閱讀 1,481評(píng)論 0 5
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,451評(píng)論 0 13
  • 前段時(shí)間一直在看lambda表達(dá)式磕瓷,但是總感覺吃不透盒齿,在深入了解lambda表達(dá)式的時(shí)候,需要很多基礎(chǔ)的知識(shí)棧困食。這...
    西瓜真好吃丶閱讀 2,723評(píng)論 0 7
  • 轉(zhuǎn)載自:《深入理解Java 8 Lambda(語言篇——lambda边翁,方法引用,目標(biāo)類型和默認(rèn)方法)》——Luci...
    琦小蝦閱讀 714評(píng)論 0 5