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

資訊專欄INFORMATION COLUMN

Java 8之Lambda表達(dá)式實際應(yīng)用

anRui / 1987人閱讀

摘要:自帶類庫使用表達(dá)式實際上中很多自帶的類庫已經(jīng)可以使用表達(dá)式來調(diào)用了,就和我們上面的代碼一樣。匿名類使用方式表達(dá)式同理線程也是可以這樣進(jìn)行改造匿名方法表達(dá)式

前面 Java 8之方法引用和Lambda表達(dá)式這篇文章講了方法引用Lambda表達(dá)式的大致原理和使用方法,但是光有理論是不夠的,現(xiàn)在這篇文章會講到它們的實際應(yīng)用,從最開始的需求一步步的優(yōu)化代碼,直到最后使用Lambda表達(dá)式。
篩選蘋果:

我們現(xiàn)在有個Apple類,它有weight和color屬性分別代表它的重量和屬性,我們創(chuàng)建多個蘋果放入List中,這樣就有了很多不同的蘋果。

public class Apple {
    private String color;
    private Integer weight;

    public Apple(String color, Integer weight) {
        this.color = color;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Integer getWeight() {
        return weight;
    }

    public void setWeight(Integer weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "color="" + color + """ +
                ", weight=" + weight +
                "}";
    }
}

public static void main(String[] args) {
    List apples = new ArrayList();
    Apple apple1 = new Apple("red", 100);
    Apple apple2 = new Apple("green", 200);
    Apple apple3 = new Apple("red", 300);
    Apple apple4 = new Apple("red", 150);
    apples.add(apple1);
    apples.add(apple2);
    apples.add(apple3);
    apples.add(apple4);
}

假設(shè)我們現(xiàn)在有個Apple類,它有weight和color屬性,現(xiàn)在有個需求,把紅色的蘋果挑出來,我們就寫出了下列的代碼。下面這段代碼再常見不過了,把未分類的集合傳進(jìn)來,新建一個集合把篩選出來的元素放進(jìn)去再返回,但是如果需求說要把綠色的都篩選出來呢?難道復(fù)制一個嗎?那也太傻了,所以我們需要對代碼進(jìn)行改進(jìn)。

public static List filterGreenApples(List apples) {
    List result = new ArrayList();
    for (Apple apple : apples) {
        if ("green".equals(apple.getColor())) {
            result.add(apple);
        }
    }
    return result;
}

經(jīng)過我們的改進(jìn),把要篩選的顏色也當(dāng)作參數(shù)傳進(jìn)來方法,這樣想選什么樣顏色就選什么顏色,但是需求永遠(yuǎn)都是會變得,如果說除了顏色還要再加上重量作為篩選呢?所以我們又對代碼進(jìn)行了改進(jìn)。

public static List filterApplesByColor(List apples, String color) {
    List result = new ArrayList();
    for (Apple apple : apples) {
        if (apple.getColor().equals(color)) {
            result.add(apple);
        }
    }
    return result;
}

既然要加多重量作為篩選條件,那干脆把重量也當(dāng)作參數(shù)傳進(jìn)去,這個時候我們發(fā)現(xiàn)這段代碼開始變得很惡心了,在項目很趕的時候很多人會寫出類似這種代碼,需求是實現(xiàn)了,但是幾乎沒有什么閱讀性可言,而且最多過一個星期,連你自己都可能看不懂自己寫的什么東西,而且如果代碼沒有BUG也就算了,有了隱藏BUG在中途被發(fā)現(xiàn)再改的話是越改越亂,所以肯定不能用這樣的代碼,我們得再改進(jìn)代碼。

public static List filterApples(List apples, String color, int weight, boolean flag) {
    List result = new ArrayList();
    for (Apple apple : apples) {
        if ((flag && apple.getColor().equals(color)) || (!flag && apple.getWeight() > weight)) {
            result.add(apple);
        }
    }
    return result;
}

現(xiàn)在封裝方法的方式已經(jīng)沒辦法很好的解決問題了,所以我們決定使用設(shè)計模式中的策略模式解決這個問題,我們新建一個接口,里面定義一個方法接受Apple參數(shù),然后我們只要實現(xiàn)這個接口重寫這個方法,就可以在這個方法里面自定義我們的篩選代碼了,我們可以直接用匿名類省去創(chuàng)建類的步驟,這也是最常用的方法,比如新建線程傳入Runnable接口就是這樣的做法

public interface ApplePredicate {
    boolean test(Apple apple);
}

public class AppleHeavyWeightPredicate implements ApplePredicate {
    public boolean test(Apple apple) {
        return apple.getWeight() > 150;
    }
}

public static List filterApples(List apples, ApplePredicate p) {
    List result = new ArrayList();
    for (Apple apple : apples) {
        if (p.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}

//使用匿名類
List redApples = filterApples(apples, new ApplePredicate() {
    public boolean test(Apple apple) {
        return "red".equals(apple.getColor());
    }
});

到現(xiàn)在其實我們的代碼已經(jīng)優(yōu)化的很好了,實際上Java 8以前很多類庫也都是這樣實現(xiàn)的,但是這樣的做法也有它的問題,那就是一長串的模板代碼,閱讀性也不怎么好,所以現(xiàn)在要輪到我們的主角上場了,使用Lambda表達(dá)式來優(yōu)化。

List result = filterApples(apples, (Apple apple) -> "red".equals(apple.getColor()));

到這里我們其實我們的目的已經(jīng)實現(xiàn)了,但是我們還可以再改進(jìn)代碼,使這個方法不局限與Apple這個里,只需要加入泛型,就可以成為一個公用的篩選方法了,篩選任意的類型數(shù)據(jù)。我們把接口接受的參數(shù)類型改成泛型,返回的類型也改成泛型,接受的需要篩選的目標(biāo)集合也改成泛型,這樣就是一個可以篩選任何類型的公用方法了。

public interface Predicate {
    boolean test(T t);
}

public static  List filter(List list, Predicate p) {
    List result = new ArrayList<>();
    for (T e : list) {
        if (p.test(e)) {
            result.add(e);
        }
    }
    return result;
}

Java自帶類庫使用Lambda表達(dá)式:

實際上Java 8中很多自帶的類庫已經(jīng)可以使用Lambda表達(dá)式來調(diào)用了,就和我們上面的代碼一樣。

在Java 8中List自帶了一個sort方法,接受Comparator(排序)類型參數(shù),按照原來的方式就是是用匿名類,現(xiàn)在我們直接用Lambda表達(dá)式。

public interface Comparator {
    public int compare(T o1, T o2);
}

//匿名類使用方式
apples.sort(new Comparator() {
    public int compare(Apple a1, Apple a2){
    return a1.getWeight().compareTo(a2.getWeight());
    }
});

//Lambda表達(dá)式
apples.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));

同理線程也是可以這樣進(jìn)行改造

public interface Runnable{
    public void run();
}

//匿名方法
Thread t = new Thread(new Runnable() {
    public void run(){
        System.out.println("Hello world");
    }
});

//Lambda表達(dá)式
Thread t = new Thread(() -> System.out.println("Hello world"));

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

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

相關(guān)文章

  • Java 8方法引用和Lambda達(dá)式

    摘要:方法引用在之前只能進(jìn)行值傳遞,方法是不能傳遞的。首先方法接受了一個類型的對象,方法是獲取所有的文件,是用來存儲篩選之后的元素,循環(huán)所有獲得到的文件數(shù)組,然后調(diào)用中的方法來進(jìn)行條件篩選,放入后返回。 方法引用: 在Java 8之前只能進(jìn)行值傳遞,方法是不能傳遞的。如果你想調(diào)用一個方法你必須先獲取到它所在的類的實例,然后再通過實例去調(diào)用這個方法,但是Java 8新增了方法引用這個新特性可以...

    legendmohe 評論0 收藏0
  • Java 8 Lambda 達(dá)式詳解

    摘要:表達(dá)式簡介表達(dá)式是一個匿名函數(shù)對于而言并不很準(zhǔn)確,但這里我們不糾結(jié)這個問題。如果表達(dá)式的正文有一條以上的語句必須包含在大括號代碼塊中,且表達(dá)式的返回值類型要與匿名函數(shù)的返回類型相同。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我們想要把某些功能傳遞給某些方...

    haoguo 評論0 收藏0
  • 樂字節(jié)-Java8核心特性實戰(zhàn)函數(shù)式接口

    摘要:大家好,上一篇小樂給大家講述了樂字節(jié)核心特性表達(dá)式,點擊回顧。接下來繼續(xù)核心特性之函數(shù)式接口。感謝大家欣賞小樂帶來的核心特性之函數(shù)式接口,接下來還會更多核心技術(shù)講解,請關(guān)注樂字節(jié)如需要視頻課程,請搜索樂字節(jié)騰訊課堂 大家好,上一篇小樂給大家講述了《樂字節(jié)-Java8核心特性-Lambda表達(dá)式》,點擊回顧。接下來繼續(xù):Java8核心特性之函數(shù)式接口。 什么時候可以使用Lambda?通常...

    niceforbear 評論0 收藏0
  • JVM 平臺上的各種語言的開發(fā)指南[z]

    摘要:我們的目標(biāo)是建立對每一種語言的認(rèn)識,它們是如何進(jìn)化的,未來將走向何方。有點的味道是堅持使用動態(tài)類型,但唯一還收到合理擁泵的編程語言,然而一些在企業(yè)的大型團(tuán)隊中工作的開發(fā)者擇認(rèn)為這會是的一個缺陷。 為什么我們需要如此多的JVM語言? 在2013年你可以有50中JVM語言的選擇來用于你的下一個項目。盡管你可以說出一大打的名字,你會準(zhǔn)備為你的下一個項目選擇一種新的JVM語言么? 如今借助來自...

    phodal 評論0 收藏0
  • 樂字節(jié)-Java8核心特性實戰(zhàn)Lambda達(dá)式

    摘要:使用表達(dá)式,使得應(yīng)用變得簡潔而緊湊。很多語言等從設(shè)計之初就支持表達(dá)式。表達(dá)式的參數(shù)與函數(shù)式接口內(nèi)方法的參數(shù),返回值類型相互對應(yīng)。更多教程和資料請上騰訊課堂樂字節(jié) showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達(dá)式,允許開發(fā)者將函數(shù)當(dāng)成參數(shù)傳遞給某個方法,或者把代碼本身當(dāng)作數(shù)據(jù)進(jìn)行處理。...

    Karuru 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<