美文网首页
java8中的lambda

java8中的lambda

作者: 编写代码的艺术 | 来源:发表于2017-03-30 23:04 被阅读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();
        }
    }
    

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

    相关文章

      网友评论

          本文标题:java8中的lambda

          本文链接:https://www.haomeiwen.com/subject/dkcmottx.html