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”;

  • 相关阅读:
    软件工程 实验二 结对编程(第一阶段)
    C#中的线程(一)入门
    C# Using与Try..Finally 语句探究
    中兴一面归来
    Log4Net 入门示例
    C++ 临时对象
    C宏定义探析
    MFC 对话框 快捷键设置(alt+s)
    C#中的线程(二) 线程同步基础
    Ip地址的正则表达式
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781846.html
Copyright © 2011-2022 走看看