java中通過行為參數(shù)化傳遞代碼方案
行為參數(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方法只能接受對象,我們其實(shí)是將代碼包裹在了ApplePredicate對象里面,每次還是需要?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)類了,大大簡化了代碼~,但是還有一個(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()));
}
這樣看起來就簡單多了,直接傳一個(gè)lambda就OK了。
但是還有一個(gè)問題,萬一農(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用
這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java使用Junit4.jar進(jìn)行單元測試的方法
今天通過本文給大家介紹Java使用Junit4.jar進(jìn)行單元測試的方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-11-11
springboot使用線程池(ThreadPoolTaskExecutor)示例
大家好,本篇文章主要講的是springboot使用線程池(ThreadPoolTaskExecutor)示例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
java中l(wèi)ist使用時(shí)需避免的場景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會導(dǎo)致諸多問題,所以本文我們就來看一看幾個(gè)錯(cuò)誤使用List的場景吧2023-10-10
實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用
這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開源,作者用其Windows平臺下的版本進(jìn)行演示,需要的朋友可以參考下2016-01-01
Java設(shè)計(jì)模式編程中簡單工廠與抽象工廠模式的使用實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式編程中簡單工廠與抽象工廠模式的使用實(shí)例,簡單工廠與抽象工廠都可以歸類于設(shè)計(jì)模式中的創(chuàng)建型模式,需要的朋友可以參考下2016-04-04
使用mybatisPlus生成oracle自增序列遇到的坑及解決
這篇文章主要介紹了使用mybatisPlus生成oracle自增序列遇到的坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

