早些年寫的:0
用過一段scala伙菊,再用java,總是不能忍受冗余拖沓的java敌土,但是scala不是哪個(gè)地方都能用镜硕,java這把武器還是得用。java8之后引入lamdba返干,刀更好用了兴枯。
開一個(gè)玩笑話,使用lambda之后矩欠,代碼能少個(gè)1/3财剖,少了糾結(jié)的匿名類悠夯,少了冗余for循環(huán)和if..else梁肿。多了簡(jiǎn)潔的lamdba表達(dá)式拆融,強(qiáng)大的streamApi莹捡,還有增強(qiáng)版的interface茧痕。
工作多年以來仆潮,Assembler模式必不可少褂微,為了是隔離變化箫章,為是PO與DTO的轉(zhuǎn)化诊笤,為的是PO與Model轉(zhuǎn)化美侦,減少重復(fù)代碼才能提高質(zhì)量产舞。匿名來一直沖在前面,一個(gè)靜態(tài)方法+無數(shù)個(gè)匿名Callback遍布各個(gè)角落菠剩。閉包的到來緩解這種情況易猫,刀更輕巧了。雖然有點(diǎn)笨重具壮,比不上c的函數(shù)指針准颓,至少封裝得更好,在應(yīng)用層面用得更舒服嘴办。
for循環(huán)和 if...else 只是為了能在茫茫大海中瞬场,找出心目中你。
public List<String> filterXXX(List<String> beFinds){
if(beFinds == null || beFinds.isEmpty()){
return null;
}
List<String> founds = new ArrayList();
for(String s:beFinds){
if(....){
founds.add(s);
}
}
return founds;
}
這樣的代碼涧郊,不知道在手中彈過多少次贯被!每寫一次這樣的代碼都要糾結(jié)一次,在沒有StreamApi的時(shí)代妆艘,只能靠GoogleGuava緩解一下彤灶。每閱讀到這樣的代碼,都要想下:我能讀懂其中的含義批旺。每改一次這樣的代碼幌陕,祈禱不要改錯(cuò)。StreamAPI不是最強(qiáng)大的工具汽煮,沒有scala那么好搏熄,但是已經(jīng)足夠讓javaer將代碼優(yōu)化更好,更好閱讀暇赤,更好修改心例。千言萬語化成:
beFinds.stream().filter(s->{...}).collect(Collectors.toList());
增強(qiáng)版的interface只是加了 默認(rèn)方法而已,但是無疑給它加上翅膀鞋囊,使之接口的含義更加豐滿止后,雖然它有點(diǎn)像scala的trait。
定義一個(gè)Duration接口,傳統(tǒng)方式只有做到此:
public interface Duration {
Date getEndTime();
Date getBeginTime();
}
相關(guān)的邏輯只能在實(shí)現(xiàn)類實(shí)現(xiàn)译株,但是default方法的到來瓜喇,可以變?yōu)?/p>
public interface Duration {
Date getEndTime();
Date getBeginTime();
public default boolean contains(Date d){
return getBeginTime().before(d) && d.before(getBeginTime());
}
public default Long interval(){
return getEndTime().getTime()-getBeginTime().getTime();
}
}
這樣的接口才是有生命,有豐富多彩的行為歉糜,是名副其實(shí)的接口乘寒,而不是僅僅是一個(gè)概念的表達(dá)。進(jìn)一步的說:抽象類的作用會(huì)被減弱现恼,接口類會(huì)大大增強(qiáng)肃续。也許它的引入,會(huì)導(dǎo)致多繼承的問題叉袍,但是這些都不是問題始锚,畢竟一把好刀被打磨之后,也需要大俠磨合一段時(shí)間T洹瞧捌!