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

    Lamdba表达式本质上是一种匿名方法,既没有方法名,也没有访问修饰符和返回值类型。
     
    如果想要在Android项目中使用Lamdba表达式或者Java 8的其他新特性,首先我们需要在app/build.gradle中添加如下配置。
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "co.example.leo.lambda"
            minSdkVersion 16
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            jackOptions.enabled = true
        }
        compileOptions{
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

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

    1 new Thread(new Runnable() {
    2     @Override
    3     public void run() {
    4         //处理具体的逻辑 
    5     }
    6 }).start();

    使用Lambda表达式可以这样写

    1 new Thread(() ->{
    2     //处理具体的逻辑
    3 }).start();
    为什么可以用这种写法呢? 是因为Thread类的构造函数接受的参数是一个Runnable接口,并且接口中只有一个待实现的方法。
    凡事只有一个待实现方法的接口,都可以使用Lambda表达式的写法。
    比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:
    1 Runnable runnable = new Runnable() {
    2     @Override
    3     public void run() {
    4        
    5      }
    6 };
    而通过Lambda表达式之后我们就可以这样写了
    1 Runnable runnable = ()->{
    2    
    3  };

    了解了Lambda表达式的基本写法,接下来我们尝试自定义一个接口,然后再使用Lambda表达式的方式进行实现

    新建一个MyListener接口 代码如下所示

    1 public interface MyListerner {
    2 
    3     String doSomething(String a, int b);
    4 }
    MyListener接口也只有一个待实现方法,这和Runnable接口的结构是基本一致的,唯一不同的是,MyListener中的doSomething()方法是有参数并且有返回值的
    使用Lambda表达式创建MyListener接口的匿名实现方法如下。
    1 MyListerner myListerner = (String a, int b) ->{
    2     String result = a + b;
    3     return result;
    4 };

    可以看到 doSomething()方法的参数直接写在括号里面就可以了,而返回值则仍然像往常一样。写在具体实现的最后一行即可。

    Java中可以根据上下文自动推断出Lambda表达式中的参数类型,因此上面的代码也可以简化成如下写法。

    1 MyListerner listerner = (a,b)->{、
    2     String result = a +b;
    3     return result;
    4 };
    Java将会自动推断出参数a是String类型,参数b是int类型。
     
     
    只要是符合接口中只有一个待实现方法这个规则的功能,都是可以使用Lambda表达式来编写的。
    类似设置点击事件之类的功能也是非常适合使用Lambda表达式的。
    使用Lambda表达式之后,就可以将代码简化成这个样子。
    1 Button button = (Button)findViewById(R.id.parent);
    2 button.setOnClickListener((v)->{
    3     //处理点击事件
    4 });

    当接口的待实现方法有且只有一个参数的时候,还可以进一步简化,将参数外面的括号去掉,如下所示。

    1 Button button = (Button)findViewById(R.id.parent);
    2 button.setOnClickListener(v->{
    3     //处理点击事件
    4 });
  • 相关阅读:
    多线程实现双色球
    使用google api material icons在网页中插入图标
    网页前端制作好的网站
    n元线性方程非负整数解的个数问题
    Dilworth定理证明
    一个简易的Python全站抓取系统
    gensim word2vec好的教程
    C语言一些常用的功能
    python3正则表达式
    python3创建目录
  • 原文地址:https://www.cnblogs.com/chase1/p/7141090.html
Copyright © 2011-2022 走看看