zoukankan      html  css  js  c++  java
  • Lambda表达式

    Lambda表达式本质上是一种匿名方法,它既没有方法名,也没有访问修饰符和返回值类型,使用它编写代码将会更加简洁,也更加容易读。
    如果想要在Android项目中使用Lambda表达式或者Java8的其他新特性,首先我们需要在app/build.gradle添加如下配置
    
    android {
        defaultConfig {
       ---------
            jackOptions.enabled = true
        }
        compileOptions{
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

    之后就可以开始使用Lambda表达式来编写代码了,比如说传统情况下开启一个子线程的写法如下:

    new Thread(new Runnable()){
    @Override
    public void run(){
       //处理具体逻辑
    }
    }).start();

    而使用Lambda表达式则可以这样写:

    new Thread(()->{
    //处理的具体逻辑
    }).start();

    是不是很神奇呢?不光是从代码的行数还是缩进结构上来看,Lambda表达式的写法明显要更加精简。
    那么为什么可以使用这么神奇的写法呢?这是因为Thread类的构造函数接受的参数是一个Runnable接口,并且该接口中有一个待实现的方法.我们查看一下Runnable接口的源码,如下所示:

    public
    interface Runnable {
        /**
         * When an object implementing interface <code>Runnable</code> is used
         * to create a thread, starting the thread causes the object's
         * <code>run</code> method to be called in that separately executing
         * thread.
         * <p>
         * The general contract of the method <code>run</code> is that it may
         * take any action whatsoever.
         *
         * @see     java.lang.Thread#run()
         */
        public abstract void run();
    }

    凡是这种只有一个待实现方法的接口,都可以使用Lambda表达式的写法.比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:

    Runnable runnable = new Runnable(){
      @Override
      public void run(){
      //添加具体实现
      }
    };
    

    而有了Lamba表达式之后我们就可以这样写了:

    Runnable runnable1 = ()->{
      //添加具体的实现
    };

    了解了Lambda表达式的基本写法,接下来我们尝试自定义一个接口,然后使用Lambda表达式的方式进行实现。
    新建一个MyListener接口,代码如下所示:

    public interface MyListener{
      String doSomething(String a,int b);
    }

    MyListener接口中也只有一个待实现方法,这和Runnable接口的结构是基本一致的。唯一不同的是,MyListener中的doSomething()方法是有参数并且是有返回值的,那么我们就来看一看这种情况下该如何使用Lambda表达式进行实现

    MyListener listener = (String a,int b) -> {
       String result = a + b;
       return result;
    };

    可以看到,doSomething()方法的参数直接写在括号里面就可以了,而返回值仍然像往常一样,写在具体实现的最后一行即可。
    另外,Java还可以根据上下文自动推断出lambda表达式中的参数类型,因此上面的代码也可以简化成如下写法

    MyListenr listener = (a,b) ->{
    String result = a + b;
    return result;
    }

    Java将会自动推断出参数a是String类型,参数b是int类型,从而使我们的代码变得更加精简了。
    接下来举个具体的例子,比如说现在有一个方法是接受MyListener参数的,如下所示:

     public void hello(MyListener listener){
       String a = "hello lambda";
       int b = 1024;
       String result = listener.doSomenting(a,b);
       Log.d("TAG",result);
     }

    我们再调用hello()这个方法的时候就可以这样写:

    hello((a,b) -> {
    String result = a+b;
    return result;
    });

    那么doSomething()方法就会将a和b两个参数进行相加,从而最终的打印结果就会是”Hello Lambda1024”;

  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781847.html
Copyright © 2011-2022 走看看