真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java8怎么通過行為參數(shù)化傳遞代碼

本篇內(nèi)容介紹了“java8怎么通過行為參數(shù)化傳遞代碼”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括監(jiān)利網(wǎng)站建設(shè)、監(jiān)利網(wǎng)站制作、監(jiān)利網(wǎng)頁(yè)制作以及監(jiān)利網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,監(jiān)利網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到監(jiān)利省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

應(yīng)對(duì)不斷變化的需求

編寫能夠應(yīng)對(duì)變化的需求的代碼并不容易。讓我們來(lái)看一個(gè)例子,我們會(huì)逐步改進(jìn)這個(gè)例子,
以展示一些讓代碼更靈活的最佳做法。就農(nóng)場(chǎng)庫(kù)存程序而言,你必須實(shí)現(xiàn)一個(gè)從列表中篩選綠蘋
果的功能。聽起來(lái)很簡(jiǎn)單吧?

第一個(gè)解決方案可能是下面這樣的:

/**
     *篩選綠蘋果
     * @param inventory 蘋果倉(cāng)庫(kù)
     * @return
    public static List filterGreenApples(List inventory){
        List result = new ArrayList<>();

        for(Apple apple:inventory){
            if ("green".equals(apple.getColor())){
                result.add(apple);
            }
        }
        return

現(xiàn)在農(nóng)民改主意了,他還想要篩選紅蘋果。
你該怎么做呢?簡(jiǎn)單的解決辦法就是復(fù)制這個(gè)方法,把名字改成 filterRedApples ,然后更改
if 條件來(lái)匹配紅蘋果。然而,要是農(nóng)民想要篩選多種顏色:淺綠色、暗紅色、黃色等,這種方法
就應(yīng)付不了了。一個(gè)良好的原則是在編寫類似的代碼之后,嘗試將其抽象化。

/**
     * 把顏色參數(shù)化,應(yīng)對(duì)顏色變化的需求
     * @param inventory
     * @param color
     * @return
    public static List filterApplesByColor(List inventory,
                                                  String color) {
        List result = new ArrayList();
        for (Apple apple: inventory){
            if ( apple.getColor().equals(color) ) {
                result.add(apple);
            }
        }
        return

這時(shí),農(nóng)民不斷提新需求,按重量刷選,按裝量和顏色篩選,于是你不斷修改代碼,粘貼復(fù)制,
一種把所有屬性結(jié)合起來(lái)的笨拙嘗試如下所示:

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

這個(gè)解決方案再差不過了。首先,客戶端代碼看上去糟透了。 true 和 false 是什么意思?此
外,這個(gè)解決方案還是不能很好地應(yīng)對(duì)變化的需求。如果這位農(nóng)民要求你對(duì)蘋果的不同屬性做篩
選,比如大小、形狀、產(chǎn)地等,又怎么辦?而且,如果農(nóng)民要求你組合屬性,做更復(fù)雜的查詢,
比如綠色的重蘋果,又該怎么辦?你會(huì)有好多個(gè)重復(fù)的 filter 方法,或一個(gè)巨大的非常復(fù)雜的
方法。

但如今這種情況下,你需要一種更好的方式,來(lái)把
蘋果的選擇標(biāo)準(zhǔn)告訴你的 filterApples 方法

行為參數(shù)化

你需要一種比添加很多參數(shù)更好的方法來(lái)應(yīng)對(duì)變化的需求。讓
我們后退一步來(lái)看看更高層次的抽象。

一種可能的解決方案是對(duì)你的選擇標(biāo)準(zhǔn)建模:你考慮的
是蘋果,需要根據(jù) Apple 的某些屬性(比如它是綠色的嗎?重量超過150克嗎?)來(lái)返回一個(gè)
boolean 值。我們把它稱為謂詞(即一個(gè)返回 boolean 值的函數(shù))。讓我們定義一個(gè)接口來(lái)對(duì)選
擇標(biāo)準(zhǔn)建模:

public interface ApplePredicate

    boolean

現(xiàn)在你就可以用 ApplePredicate 的多個(gè)實(shí)現(xiàn)代表不同的選擇標(biāo)準(zhǔn)了.

/**
 * 選出重蘋果的實(shí)現(xiàn)類
 *
 * @author itguang
 * @create
public class AppleHeavyWeightPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight()>150;
    }
}
/**
 * 選出綠蘋果的實(shí)現(xiàn)類
 *
 * @author itguang
 * @create
public class AppleGreenColorPredicate implements ApplePredicate
    @Override
    public boolean test(Apple apple) {
        return "green".equals(apple.getColor());
    }
}

你可以把這些實(shí)現(xiàn)類看做filter方法的不同行為,剛做的這些和策略設(shè)計(jì)模式相關(guān),他讓你定義一簇算法(稱為 :策略),然后在運(yùn)行時(shí)選擇一個(gè)算法。在這里,
算法族就是 ApplePredicate ,不同的策略就是 AppleHeavyWeightPredicate 和 AppleGreen-ColorPredicate 。

但是,該怎么利用 ApplePredicate 的不同實(shí)現(xiàn)呢?

你需要 filterApples 方法接受
ApplePredicate 對(duì)象,對(duì) Apple 做條件測(cè)試。這就是行為參數(shù)化:讓方法接受多種行為(或戰(zhàn)
略)作為參數(shù),并在內(nèi)部使用,來(lái)完成不同的行為。

filter 方法看起來(lái)是這樣的:

“`java 
 /** 
 * 根據(jù)抽象條件進(jìn)行篩選 
 * @param inventory 
 * @param applePredicate 
 * @return 
 */ 
 public static List filter(List inventory, ApplePredicate applePredicate){ 
 ArrayList list = new ArrayList<>(); 
 for (Apple apple:list){ 
 if(applePredicate.test(apple)){ 
 list.add(apple); 
 } 
 } 
 return list;}

“`
* 1. 傳遞代碼/行為:

這里值得停下來(lái)小小地慶祝一下。這段代碼比我們第一次嘗試的時(shí)候靈活多了,讀起來(lái)、用
起來(lái)也更容易!現(xiàn)在你可以創(chuàng)建不同的 ApplePredicate 對(duì)象,并將它們傳遞給 filterApples
方法.
你已經(jīng)做成了一件很酷的事: filterApples 方法的行為取決于你通過 ApplePredicate 對(duì)象傳遞的代碼。換句話說(shuō),你把 filterApples 方法的行為參數(shù)化了!

請(qǐng)注意,在上一個(gè)例子中,唯一重要的代碼是 test 方法的實(shí)現(xiàn),如圖2-2所示;正是它定義
了 filterApples 方法的新行為。但令人遺憾的是,由于該 filterApples 方法只能接受對(duì)象,
所以你必須把代碼包裹在 ApplePredicate 對(duì)象里。你的做法就類似于在內(nèi)聯(lián)“傳遞代碼”,因
為你是通過一個(gè)實(shí)現(xiàn)了 test 方法的對(duì)象來(lái)傳遞布爾表達(dá)式的

這就是說(shuō)行為參數(shù)化是一個(gè)有用的概念的原因。你應(yīng)該把它放進(jìn)你的工具箱里,用來(lái)編寫靈
活的API

對(duì)付啰嗦

到此,我們覺得已經(jīng)做的很好了,我們使用行為參數(shù)化解決了一些棘手的問題.
但是,目前來(lái)說(shuō),當(dāng)要把新的行為傳遞給
filterApples 方法的時(shí)候,你不得不聲明好幾個(gè)實(shí)現(xiàn) ApplePredicate 接口的類,然后實(shí)例化
好幾個(gè)只會(huì)提到一次的 ApplePredicate 對(duì)象。

Java有一個(gè)機(jī)制稱為匿名類,它可以讓你同時(shí)
聲明和實(shí)例化一個(gè)類。它可以幫助你進(jìn)一步改善代碼,讓它變得更簡(jiǎn)潔。但這也不完全令人滿意。它往往很笨重,因?yàn)樗加昧撕芏嗫臻g。

使用 Lambda 表達(dá)式

“`java 
 //將 List 類型抽象化 
 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; 
 }
/**
     * 用Lambda表達(dá)式對(duì)倉(cāng)庫(kù)的蘋果按重量升序排序
     */
    @Test
    public void test3(){
        List inventory = initInventory();
        inventory.sort((Apple o1,Apple o2)->o1.getWeight().compareTo(o2.getWeight()));
        System.out.println(inventory);

    }

現(xiàn)在暫時(shí)不用擔(dān)心這個(gè)新語(yǔ)法,下一章我們會(huì)詳細(xì)講解如何編寫和使用Lambda表達(dá)式。

舉例2:用 Runnable 執(zhí)行代碼塊

線程就像是輕量級(jí)的進(jìn)程:它們自己執(zhí)行一個(gè)代碼塊。但是,怎么才能告訴線程要執(zhí)行哪塊
代碼呢?多個(gè)線程可能會(huì)運(yùn)行不同的代碼。我們需要一種方式來(lái)代表稍候執(zhí)行的一段代碼。在
Java里,你可以使用 Runnable 接口表示一個(gè)要執(zhí)行的代碼塊。請(qǐng)注意,代碼不會(huì)返回任何結(jié)果
(即 void ):

// java.lang.Runnable
public interface Runnable{
     public void run();
}

你可以像下面這樣,使用這個(gè)接口創(chuàng)建執(zhí)行不同行為的線程:

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

用Lambda表達(dá)式的話,看起來(lái)是這樣:

Thread t = new Thread(() -> System.out.println("Hello world"));

“java8怎么通過行為參數(shù)化傳遞代碼”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


文章名稱:java8怎么通過行為參數(shù)化傳遞代碼
文章源于:http://weahome.cn/article/goghic.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部