早些年写的:0
用过一段scala,再用java,总是不能忍受冗余拖沓的java,但是scala不是哪个地方都能用,java这把武器还是得用。java8之后引入lamdba,刀更好用了。
开一个玩笑话,使用lambda之后,代码能少个1/3,少了纠结的匿名类,少了冗余for循环和if..else。多了简洁的lamdba表达式,强大的streamApi,还有增强版的interface。
工作多年以来,Assembler模式必不可少,为了是隔离变化,为是PO与DTO的转化,为的是PO与Model转化,减少重复代码才能提高质量。匿名来一直冲在前面,一个静态方法+无数个匿名Callback遍布各个角落。闭包的到来缓解这种情况,刀更轻巧了。虽然有点笨重,比不上c的函数指针,至少封装得更好,在应用层面用得更舒服。
for循环和 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;
}
这样的代码,不知道在手中弹过多少次!每写一次这样的代码都要纠结一次,在没有StreamApi的时代,只能靠GoogleGuava缓解一下。每阅读到这样的代码,都要想下:我能读懂其中的含义。每改一次这样的代码,祈祷不要改错。StreamAPI不是最强大的工具,没有scala那么好,但是已经足够让javaer将代码优化更好,更好阅读,更好修改。千言万语化成:
beFinds.stream().filter(s->{...}).collect(Collectors.toList());
增强版的interface只是加了 默认方法而已,但是无疑给它加上翅膀,使之接口的含义更加丰满,虽然它有点像scala的trait。
定义一个Duration接口,传统方式只有做到此:
public interface Duration {
Date getEndTime();
Date getBeginTime();
}
相关的逻辑只能在实现类实现,但是default方法的到来,可以变为
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();
}
}
这样的接口才是有生命,有丰富多彩的行为,是名副其实的接口,而不是仅仅是一个概念的表达。进一步的说:抽象类的作用会被减弱,接口类会大大增强。也许它的引入,会导致多继承的问题,但是这些都不是问题,毕竟一把好刀被打磨之后,也需要大侠磨合一段时间!!