最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中通過行為參數(shù)化傳遞代碼方案

 更新時(shí)間:2022年02月14日 09:49:48   作者:玉帶林中掛  
大家好,本篇文章主要講的是java中通過行為參數(shù)化傳遞代碼方案,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下

行為參數(shù)化:它意味著拿出一個(gè)代碼塊,把它準(zhǔn)備好但是不執(zhí)行,可以推遲該代碼塊的執(zhí)行,比如將代碼塊作為參數(shù),需要的時(shí)候再內(nèi)部執(zhí)行。
下面我來通過例子來描述什么是行為參數(shù)化:
現(xiàn)在來寫一個(gè)有關(guān)篩選蘋果的demo,現(xiàn)在農(nóng)民伯伯想要篩選紅色的蘋果,可以這樣來做:

方案一

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

現(xiàn)在有一個(gè)問題,當(dāng)農(nóng)民伯伯改變了主意,它還要篩選紅色的蘋果,我們是不是還要寫一個(gè)以“red”為篩選條件的方法呢?是這些方法有很多重復(fù)的內(nèi)容,這就非常冗余。

方案二

我們可以做一層抽象,將總是變化的東西抽出來,這里經(jīng)常變的是顏色,我們當(dāng)然可以把顏色抽出來作為一個(gè)參數(shù)傳到篩選的方法里面:

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

這樣即使農(nóng)民伯伯要求五彩斑斕的黑色蘋果,也可以篩選出來,但是如果農(nóng)民伯伯還要篩選重量小于150g的蘋果,那還要寫有關(guān)重量的方法來進(jìn)行篩選,這期間有很多重復(fù)的代碼,如果要去除冗余,我們可再做一層抽象,將蘋果抽象出來。

方案三

public interface ApplePredicate {
    Boolean test(Apple apple);
}
public class AppleRedColorPredicate implements ApplePredicate {
    @Override
    public Boolean test(Apple apple) {
        return "red".equals(apple.getColor());
    }
}

這樣再進(jìn)行篩選紅色的蘋果

 public static List<Apple> filterRedColorApples(List<Apple> inventory,ApplePredicate predicate){
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (predicate.test(apple)){
                result.add(apple);
            }
        }
        return result;
    }

這樣的代碼就非常的靈活了,如果想要綠色代碼,就創(chuàng)建一個(gè)AppleGeenColorPredicate類,如果想要重量大于150g的蘋果,也是類似,創(chuàng)建一個(gè)AppleWeightPredicate類即可。

這其實(shí)就是行為參數(shù)化,讓方法來接收多種行為做參數(shù),并在內(nèi)部使用,來完成不同的行為。
但是有些遺憾的是,filterRedColorApples方法只能接受對(duì)象,我們其實(shí)是將代碼包裹在了ApplePredicate對(duì)象里面,每次還是需要?jiǎng)?chuàng)建好多的類來完成功能。我們可以通過匿名內(nèi)部類來實(shí)現(xiàn)該功能。

方案四

 public static void main(String[] args) {

        List<Apple> apples = Arrays.asList(new Apple("red", 100), new Apple("green", 200));

        List<Apple> redColorApple = filterColorApples(apples, new ApplePredicate() {
            @Override
            public Boolean test(Apple apple) {
                return "red".equals(apple.getColor());
            }
        });
    }

我們還可以使用上面的方法,通過傳一個(gè)匿名內(nèi)部類來實(shí)現(xiàn)我們的功能,這樣就不用寫好多的實(shí)現(xiàn)類了,大大簡(jiǎn)化了代碼~,但是還有一個(gè)缺點(diǎn),就是匿名內(nèi)部類看起來比較啰嗦,并且也不太好理解,我們可以使用java8的新特性–λ表達(dá)式。

方案五

 public static void main(String[] args) {

        List<Apple> apples = Arrays.asList(new Apple("red", 100), new Apple("green", 200));

        List<Apple> redColorApple = filterColorApples(apples, (Apple a) -> "red".equals(a.getColor()));
        
    }

這樣看起來就簡(jiǎn)單多了,直接傳一個(gè)lambda就OK了。
但是還有一個(gè)問題,萬(wàn)一農(nóng)品伯伯想要再進(jìn)行香蕉的篩選怎么辦?我們可以使用泛型來實(shí)現(xiàn),

方案六

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

List<Apple> redColorApple = filterColorApples(apples, (Apple a) -> "red".equals(a.getColor()));

這樣來起來就更加的靈活了。

總結(jié):

以上幾個(gè)例子依次展示了如何做好抽象,完成更靈活的代碼,也展示了由變量到接口到匿名類到lambda表達(dá)式的演進(jìn),這都是慢慢演化過來的,最主要的還是要明白最初的寫法,在優(yōu)秀的代碼也是站在最初的思路上進(jìn)行優(yōu)化的。

到此這篇關(guān)于java中通過行為參數(shù)化傳遞代碼方案的文章就介紹到這了,更多相關(guān)java傳遞代碼方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

    spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

    這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java使用Junit4.jar進(jìn)行單元測(cè)試的方法

    Java使用Junit4.jar進(jìn)行單元測(cè)試的方法

    今天通過本文給大家介紹Java使用Junit4.jar進(jìn)行單元測(cè)試的方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-11-11
  • springboot使用線程池(ThreadPoolTaskExecutor)示例

    springboot使用線程池(ThreadPoolTaskExecutor)示例

    大家好,本篇文章主要講的是springboot使用線程池(ThreadPoolTaskExecutor)示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)

    java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)

    眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會(huì)導(dǎo)致諸多問題,所以本文我們就來看一看幾個(gè)錯(cuò)誤使用List的場(chǎng)景吧
    2023-10-10
  • 實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開源,作者用其Windows平臺(tái)下的版本進(jìn)行演示,需要的朋友可以參考下
    2016-01-01
  • java多線程編程之線程的生命周期

    java多線程編程之線程的生命周期

    線程要經(jīng)歷開始(等待)、運(yùn)行、掛起和停止四種不同的狀態(tài)。這四種狀態(tài)都可以通過Thread類中的方法進(jìn)行控制。下面給出了Thread類中和這四種狀態(tài)相關(guān)的方法
    2014-01-01
  • Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠與抽象工廠模式的使用實(shí)例

    Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠與抽象工廠模式的使用實(shí)例

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠與抽象工廠模式的使用實(shí)例,簡(jiǎn)單工廠與抽象工廠都可以歸類于設(shè)計(jì)模式中的創(chuàng)建型模式,需要的朋友可以參考下
    2016-04-04
  • 使用mybatisPlus生成oracle自增序列遇到的坑及解決

    使用mybatisPlus生成oracle自增序列遇到的坑及解決

    這篇文章主要介紹了使用mybatisPlus生成oracle自增序列遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Feign之Multipartfile文件傳輸填坑

    Feign之Multipartfile文件傳輸填坑

    這篇文章主要介紹了Feign之Multipartfile文件傳輸埋坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JAVA IO的3種類型區(qū)別解析

    JAVA IO的3種類型區(qū)別解析

    這篇文章主要介紹了JAVA IO的3種類型解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

桐柏县| 正蓝旗| 宁德市| 买车| 民县| 芒康县| 武安市| 育儿| 伊宁县| 基隆市| 扎兰屯市| 双鸭山市| 当雄县| 射洪县| 宜阳县| 天峨县| 安宁市| 巴南区| 马山县| 太和县| 色达县| 依兰县| 荃湾区| 文昌市| 涡阳县| 夏邑县| 敦煌市| 都江堰市| 海阳市| 治县。| 宜昌市| 涿州市| 海口市| 建湖县| 惠州市| 武强县| 广州市| 安国市| 长丰县| 沽源县| 应城市|