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 });
  • 相关阅读:
    人一生要去的100个地方(世界)
    数据仓库相关书籍
    学理财要看的书籍
    数仓设计 Building the Data Warehouse
    Google Cloud 安装java
    Google Cloud install python3 (in CentOS)
    SyntaxError: Non-ASCII character 'xe5' in file test23.py on line 2, but no encoding declared;
    CentOS 安装7z
    CentOS 安装 MySQL
    复杂迭代代码分析
  • 原文地址:https://www.cnblogs.com/chase1/p/7141090.html
Copyright © 2011-2022 走看看