国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

anRui / 1984人閱讀

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

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

我們現(xiàn)在有個(gè)Apple類,它有weight和color屬性分別代表它的重量和屬性,我們創(chuàng)建多個(gè)蘋果放入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)在有個(gè)Apple類,它有weight和color屬性,現(xiàn)在有個(gè)需求,把紅色的蘋果挑出來,我們就寫出了下列的代碼。下面這段代碼再常見不過了,把未分類的集合傳進(jìn)來,新建一個(gè)集合把篩選出來的元素放進(jìn)去再返回,但是如果需求說要把綠色的都篩選出來呢?難道復(fù)制一個(gè)嗎?那也太傻了,所以我們需要對(duì)代碼進(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)都是會(huì)變得,如果說除了顏色還要再加上重量作為篩選呢?所以我們又對(duì)代碼進(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)去,這個(gè)時(shí)候我們發(fā)現(xiàn)這段代碼開始變得很惡心了,在項(xiàng)目很趕的時(shí)候很多人會(huì)寫出類似這種代碼,需求是實(shí)現(xiàn)了,但是幾乎沒有什么閱讀性可言,而且最多過一個(gè)星期,連你自己都可能看不懂自己寫的什么東西,而且如果代碼沒有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è)計(jì)模式中的策略模式解決這個(gè)問題,我們新建一個(gè)接口,里面定義一個(gè)方法接受Apple參數(shù),然后我們只要實(shí)現(xiàn)這個(gè)接口重寫這個(gè)方法,就可以在這個(gè)方法里面自定義我們的篩選代碼了,我們可以直接用匿名類省去創(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)在其實(shí)我們的代碼已經(jīng)優(yōu)化的很好了,實(shí)際上Java 8以前很多類庫(kù)也都是這樣實(shí)現(xiàn)的,但是這樣的做法也有它的問題,那就是一長(zhǎng)串的模板代碼,閱讀性也不怎么好,所以現(xiàn)在要輪到我們的主角上場(chǎng)了,使用Lambda表達(dá)式來優(yōu)化。

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

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

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自帶類庫(kù)使用Lambda表達(dá)式:

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

在Java 8中List自帶了一個(gè)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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71432.html

相關(guān)文章

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

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

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

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

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

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

    niceforbear 評(píng)論0 收藏0
  • JVM 平臺(tái)上的各種語(yǔ)言的開發(fā)指南[z]

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

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

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

    Karuru 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<