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

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

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

行為參數(shù)化:它意味著拿出一個代碼塊,把它準(zhǔn)備好但是不執(zhí)行,可以推遲該代碼塊的執(zhí)行,比如將代碼塊作為參數(shù),需要的時候再內(nèi)部執(zhí)行。
下面我來通過例子來描述什么是行為參數(shù)化:
現(xiàn)在來寫一個有關(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)在有一個問題,當(dāng)農(nóng)民伯伯改變了主意,它還要篩選紅色的蘋果,我們是不是還要寫一個以“red”為篩選條件的方法呢?是這些方法有很多重復(fù)的內(nèi)容,這就非常冗余。

方案二

我們可以做一層抽象,將總是變化的東西抽出來,這里經(jīng)常變的是顏色,我們當(dāng)然可以把顏色抽出來作為一個參數(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)建一個AppleGeenColorPredicate類,如果想要重量大于150g的蘋果,也是類似,創(chuàng)建一個AppleWeightPredicate類即可。

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

我們還可以使用上面的方法,通過傳一個匿名內(nèi)部類來實現(xiàn)我們的功能,這樣就不用寫好多的實現(xià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()));
        
    }

這樣看起來就簡單多了,直接傳一個lambda就OK了。
但是還有一個問題,萬一農(nóng)品伯伯想要再進(jìn)行香蕉的篩選怎么辦?我們可以使用泛型來實現(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é):

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

到此這篇關(guān)于java中通過行為參數(shù)化傳遞代碼方案的文章就介紹到這了,更多相關(guān)java傳遞代碼方案內(nèi)容請搜索腳本之家以前的文章或繼續(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java使用Junit4.jar進(jìn)行單元測試的方法

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

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

    springboot使用線程池(ThreadPoolTaskExecutor)示例

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

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

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

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

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

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

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

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

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

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

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

    Feign之Multipartfile文件傳輸填坑

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

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

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

最新評論

娄底市| 湄潭县| 安平县| 门头沟区| 襄汾县| 揭阳市| 淮滨县| 阿勒泰市| 承德市| 松滋市| 上虞市| 达尔| 三亚市| 兴安盟| 鹰潭市| 凌云县| 九龙县| 永胜县| 柞水县| 隆化县| 腾冲县| 环江| 开原市| 哈密市| 德昌县| 泰安市| 汾西县| 剑川县| 长子县| 桐梓县| 滦平县| 乐昌市| 彩票| 蒲城县| 习水县| 顺平县| 江陵县| 商南县| 枣强县| 巴彦淖尔市| 岳西县|