Lambda表达式

来源:互联网 发布:聚划算淘宝商城特价区 编辑:程序博客网 时间:2024/06/11 18:43
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()){@Overridepublic void run(){   //处理具体逻辑}}).start();

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

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

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

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

原创粉丝点击