zoukankan      html  css  js  c++  java
  • 深入浅出java 8 lambda表达式--零基础一分钟入门

    lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如:

        public static void main(String[] args) {
            PlatformQuery query = new PlatformQuery().createDemo();
            Runnable c = () -> { System.out.println(JsonUtils.toJson(query)); };
            Thread thread = new Thread(c);
            thread.start();
        }

    对着这段代码,会打印出:

    {"lists":[{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"},{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"}]}

    在java 8以前,如果我们要启动一个新线程,就需要创建一个新的类或者匿名实现类,实现Runnable接口中的run()方法,然后作为参数传递个Thread来完成。

    使用lambda之后,就不需要新建一个实现Runaable接口的类,直接在主线程上下文中就可以完成。其中run()实现的内容就是上文的{ System.out.println(JsonUtils.toJson(query)); };,()则是run方法的签名。

    从代码直观性上来说,确实简化了很多。

    再比如,对于list排序,在java 8中,我们可以直接使用list.sort(Comparator),如下所示:

            query.getLists().sort(new Comparator<Platform>() {
    
                @Override
                public int compare(Platform a, Platform b) {
                    return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length());
                }
                
            });
            

    采用lambda表达式之后,我们可以使用以下两种写法:

            Comparator<Platform> com = (Platform a, Platform b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); };
            query.getLists().sort(com);
    
            query.getLists().sort((Platform a, Platform b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); }); -- 这是直接使用匿名lambda表达式的例子

    进一步的,lambda能够自动推导上下文,比泛型的编译时擦除(erase)还要进一步,如下:

            Comparator<Platform> com1 = (a,b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); };
            
            query.getLists().sort(com1);
            
            query.getLists().sort((a, b) -> { return Integer.compare(a.getCompanyId().length(),b.getCompanyId().length()); });

     从上文可以看出,这比较像jquery中绑定事件的常见用法,凡事通过传递一个匿名函数来解决,对于基于Java的GUI编程或者使用future、以及spring JDBC等广泛依赖回调函数的应用来说,可以使代码去除很多不必要的skeleton代码。

    从语义上来看,使用lambda表达式的一个较大差别是,使用lambda实现原来匿名类的功能在生成字节码时不会自动生成匿名类,这可以通过查看生成的class文件知道。更大的差别是,lambda不会生成新的独立上下文,也就是在lambda块中可以访问所在上下文的各种变量和函数,如下所示:

        public static void main(String[] args) {
            SpiderActionV2 action = new SpiderActionV2();
            action.lambdaTest();
        }
        
        public void lambdaTest() {
            PlatformQuery query = new PlatformQuery().createDemo();
            Runnable c = () -> {     callMainFunc(query); 
                                    System.out.println(this.getClass().getCanonicalName()); };
            Thread thread = new Thread(c);
            thread.start();
        }
    
        /**
         * 
         */
        private void callMainFunc(PlatformQuery query) {
            System.out.println(JsonUtils.toJson(query));
        }

     输出如下:

    {"lists":[{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"},{"nodeId":100001,"nodeName":"机构100001","companyId":"1200","createDate":"20160101"}]}
    com.ld.net.spider.demo.action.v2.SpiderActionV2

    PS:java 8的完整新特性官方说明可见http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html。

    java各个版本的语言特性重大变更可见http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html。

  • 相关阅读:
    9. MySQL
    python第四课
    python第三课pycharm的使用
    python第二课
    python第一课
    Python3基础-网络编程(8)
    Python3基础-异常处理(7)
    Python3基础-面向对象(6)
    Python3基础-模块和包(5)
    Python3基础-文件处理(4)
  • 原文地址:https://www.cnblogs.com/zhjh256/p/5987680.html
Copyright © 2011-2022 走看看