java8中的lambda

2017-03-30  本文已影响0人  编写代码的艺术

早些年写的: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();
    }
}

这样的接口才是有生命,有丰富多彩的行为,是名副其实的接口,而不是仅仅是一个概念的表达。进一步的说:抽象类的作用会被减弱,接口类会大大增强。也许它的引入,会导致多继承的问题,但是这些都不是问题,毕竟一把好刀被打磨之后,也需要大侠磨合一段时间!!

上一篇下一篇

猜你喜欢

热点阅读