[Java8]Java8 lambda表達(dá)式學(xué)習(xí)

0x00 例子

1、 用lambda表達(dá)式實現(xiàn)Runnable

import java.util.Arrays;

/**
 * Created by haicheng.lhc on 10/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/10
 */
public class Test {
    public static void main(String[] args) {
//        java8之前
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Before Java8, too much code for too little to do");
            }
        }).start();
//      java8之后
        new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
    }
}

輸出結(jié)果:

2汰翠、使用lambda表達(dá)式對列表進(jìn)行迭代

import java.util.Arrays;
import java.util.List;

/**
 * Created by haicheng.lhc on 10/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/10
 */
public class Test {
    public static void main(String[] args) {

        // Java 8之前:
        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        for (String feature : features) {
            System.out.println(feature);
        }

        // Java 8之后:
        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        features.forEach(n -> System.out.println(n));

        // 使用Java 8的方法引用更方便临谱,方法引用由::雙冒號操作符標(biāo)示,
        features.forEach(System.out::println);
    }
}

3奴璃、使用lambda表達(dá)式和函數(shù)式接口Predicate

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class TT {

    public static void main(String args[]) {
        List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");

        System.out.println("Languages which starts with J :");
        filter(languages, (str) -> str.startsWith("J"));

        System.out.println("Languages which ends with a ");
        filter(languages, (str) -> str.endsWith("a"));

        System.out.println("Print all languages :");
        filter(languages, (str) -> true);

        System.out.println("Print no language : ");
        filter(languages, (str) -> false);

        System.out.println("Print language whose length greater than 4:");
        filter(languages, (str) -> str.length() > 4);
    }

    public static void filter(List<String> names, Predicate<String> condition) {
        for (String name : names) {
            if (condition.test(name)) {
                System.out.println(name + " ");
            }
        }
    }
}

其中的filter可以實現(xiàn)的更加優(yōu)雅

  public static void filter(List<String> names, Predicate<String> condition) {
        names.stream().filter((name) -> (condition.test(name))).forEach((name) -> {
            System.out.println(name + " ");
        });
    }

4悉默、通過過濾創(chuàng)建一個String列表

過濾是Java開發(fā)者在大規(guī)模集合上的一個常用操作,而現(xiàn)在使用lambda表達(dá)式和流API過濾大規(guī)模數(shù)據(jù)集合是驚人的簡單苟穆。流提供了一個 filter() 方法抄课,接受一個 Predicate 對象,即可以傳入一個lambda表達(dá)式作為過濾邏輯雳旅。下面的例子是用lambda表達(dá)式過濾Java集合跟磨,將幫助理解

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class T2 {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("Java", "Scala", "C", "Haskell", "Lisp");
        // 創(chuàng)建一個字符串列表,每個字符串長度大于2
        List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
        System.out.printf("Original List : %s %n filtered list : %s %n", strList, filtered);
    }
}


0x01 lambda表達(dá)式語法

(params) -> expression
(params) -> statement
(params) -> { statements }

如果只有一個參數(shù)攒盈,可以不寫()

0x02 lambda表達(dá)式和要點

  • lambda表達(dá)式僅能放入如下代碼:預(yù)定義使用了 @Functional 注釋的函數(shù)式接口抵拘,自帶一個抽象函數(shù)的方法,或者SAM(Single Abstract Method 單個抽象方法)類型型豁。這些稱為lambda表達(dá)式的目標(biāo)類型僵蛛,可以用作返回類型尚蝌,或lambda目標(biāo)代碼的參數(shù)。例如充尉,若一個方法接收Runnable飘言、Comparable或者 Callable 接口,都有單個抽象方法驼侠,可以傳入lambda表達(dá)式姿鸿。類似的,如果一個方法接受聲明于 java.util.function 包內(nèi)的接口倒源,例如 Predicate苛预、Function、Consumer 或 Supplier笋熬,那么可以向其傳lambda表達(dá)式碟渺。
  • lambda表達(dá)式內(nèi)可以使用方法引用,僅當(dāng)該方法不修改lambda表達(dá)式提供的參數(shù)突诬。本例中的lambda表達(dá)式可以換為方法引用苫拍,因為這僅是一個參數(shù)相同的簡單方法調(diào)用。
list.forEach(n -> System.out.println(n)); 
list.forEach(System.out::println);  // 使用方法引用

若對參數(shù)有任何修改旺隙,則不能使用方法引用绒极,而需鍵入完整地lambda表達(dá)式,如下所示:

list.forEach((String s) -> System.out.println("*" + s + "*"));
  • lambda內(nèi)部可以使用靜態(tài)蔬捷、非靜態(tài)和局部變量垄提,這稱為lambda內(nèi)的變量捕獲。
  • Lambda表達(dá)式在Java中又稱為閉包或匿名函數(shù)
  • Lambda方法在編譯器內(nèi)部被翻譯成私有方法周拐,并派發(fā) invokedynamic 字節(jié)碼指令來進(jìn)行調(diào)用铡俐。
  • lambda表達(dá)式有個限制,那就是只能引用 final 或 final 局部變量妥粟,這就是說不能在lambda內(nèi)部修改定義在域外的變量审丘。如下代碼會編譯報錯
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by haicheng.lhc on 13/04/2017.
 *
 * @author haicheng.lhc
 * @date 2017/04/13
 */
public class T2 {
    public static void main(String[] args) {
        List<Integer> primes = Arrays.asList(new Integer[]{2, 3,5,7});
        int factor = 2;
        primes.forEach(element -> { factor++; });
    }
}

0x03 函數(shù)式開發(fā)

0x04 函數(shù)接口

  • lambda表達(dá)式的目標(biāo)是函數(shù)接口。所以我們要了解一下啥是函數(shù)接口
  • 學(xué)習(xí)資料
  • 函數(shù)接口指的是只有一個函數(shù)的接口勾给,這樣的接口可以隱式轉(zhuǎn)換為Lambda表達(dá)式滩报。java.lang.Runnablejava.util.concurrent.Callable是函數(shù)式接口的最佳例子
  • Java 8 提供了一個特殊的注解@FunctionalInterface來標(biāo)明一個接口是函數(shù)接口
package java.lang;

/**
 *
 * @author  Arthur van Hoff
 * @see     java.lang.Thread
 * @see     java.util.concurrent.Callable
 * @since   JDK1.0
 */
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末播急,一起剝皮案震驚了整個濱河市脓钾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桩警,老刑警劉巖可训,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡握截,警方通過查閱死者的電腦和手機(jī)飞崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川蒙,“玉大人蚜厉,你說我怎么就攤上這事长已⌒笳#” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵术瓮,是天一觀的道長康聂。 經(jīng)常有香客問我,道長胞四,這世上最難降的妖魔是什么恬汁? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮辜伟,結(jié)果婚禮上氓侧,老公的妹妹穿的比我還像新娘。我一直安慰自己导狡,他們只是感情好约巷,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旱捧,像睡著了一般独郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枚赡,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天氓癌,我揣著相機(jī)與錄音,去河邊找鬼贫橙。 笑死贪婉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卢肃。 我是一名探鬼主播谓松,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼践剂!你這毒婦竟也來了鬼譬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤逊脯,失蹤者是張志新(化名)和其女友劉穎优质,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡巩螃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年演怎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片避乏。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡爷耀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拍皮,到底是詐尸還是另有隱情歹叮,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布铆帽,位于F島的核電站咆耿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爹橱。R本人自食惡果不足惜萨螺,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愧驱。 院中可真熱鬧慰技,春花似錦、人聲如沸组砚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫确。三九已至手报,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間改化,已是汗流浹背掩蛤。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留陈肛,地道東北人揍鸟。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像句旱,于是被迫代替她去往敵國和親阳藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • Java 8 lambda表達(dá)式示例 轉(zhuǎn)自importNew 原文鏈接 例1谈撒、用lambda表達(dá)式實現(xiàn)Runnab...
    低至一折起閱讀 1,371評論 0 3
  • 簡介 概念 Lambda 表達(dá)式可以理解為簡潔地表示可傳遞的匿名函數(shù)的一種方式:它沒有名稱腥泥,但它有參數(shù)列表、函數(shù)主...
    劉滌生閱讀 3,207評論 5 18
  • 原文鏈接: Lambdas 原文作者: shekhargulati 譯者: leege100 lambda表達(dá)式是...
    忽來閱讀 6,599評論 8 129
  • lambda表達(dá)式(又被成為“閉包”或“匿名方法”)方法引用和構(gòu)造方法引用擴(kuò)展的目標(biāo)類型和類型推導(dǎo)接口中的默認(rèn)方法...
    183207efd207閱讀 1,486評論 0 5
  • 認(rèn)識一個朋友啃匿,開始交往時蛔外,為他的會來事折服蛆楞。特別是在一些熟人場合,他說的話恰到好處夹厌,往往把氣氛調(diào)的非常的熱鬧豹爹。 后...
    王子和白龍馬閱讀 273評論 1 0