zoukankan      html  css  js  c++  java
  • Android中使用lambda表达式

    lambda 语法简介

    视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷

    如果刚学Android,不知道怎么写点击事件可以跳转,传送门

    要想在Android中使用lambda语法,首先我们需要了解下lambda语法是什么?
    lambda语法是java8的新特性,能够大量减少匿名内部类那种冗余的代码。

    我们先来看看老版的java代码,比如排列字符串:

    List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
    Collections.sort(names, new Comparator<String>() {
        @Override
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
    });
    

    只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

    在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

    Collections.sort(names, (String a, String b) -> {
        return b.compareTo(a);
    });

    看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短,
    对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字:

    Collections.sort(names, (String a, String b) -> b.compareTo(a));

    起始你还可以挑战下lambada的极限,还可以写得更短点:

    Collections.sort(names, (a, b) -> b.compareTo(a));
    

    当然lambda语法还有好多新特性,
    比如我们可以直接在lambda表达式中访问外层的局部变量:

        public void method(){
            String i="i";
            button.setOnClickListener(v->{
                Log.i("lambda",i); // 不报错
                // i="a"; // 编译报错
            });
        }

    和之前不同的是,这里的变量i可以不用声明为final,不过这里的i必须不可被后面的代码修改(即隐性的具有final的语义)

    Android中使用lambda表达式

    我们刚刚简单介绍了java8的新特性lambda,接下来我们就来看看怎么在Android中使用lambda。

    由于lambda是java8新特性,所以请确保你的电脑里面有jdk8,然后记得Android Studio中配置jdk环境

    这里写图片描述

    注意,后面的才是重点, 因为google公司和oracle公司一直在打官司,所以Android默认是不支持java8的,如果你直接在代码中使用lambda语法,编译的时候就会提示“lambda expression are not supported at this language level”。

    虽然不能直接使用,但是Android Studio这个工具相当棒,我们可以通过集成插件的形式使用,github地址

    步骤1:
    我们需要首先在项目根目录的build.gradle文件中添加依赖 “me.tatarka:gradle-retrolambda:3.2.0”

        dependencies {
            classpath 'com.android.tools.build:gradle:1.3.0'
            classpath 'me.tatarka:gradle-retrolambda:3.2.0'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }

    步骤2
    在module目录下的build.gradle文件中应用插件

    apply plugin: 'com.android.application'
    apply plugin: 'me.tatarka.retrolambda'

    步骤3
    在module目录下build.gradle文件中的android节点下还需要表明使用jdk8,需要做如下配置:

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

    配置完以后,预览下module目录下的build.gradle

    apply plugin: 'com.android.application'
    apply plugin: 'me.tatarka.retrolambda'
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.1"
    
        defaultConfig {
            applicationId "com.demo.myapplication"
            minSdkVersion 14
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.0.1'
    }

    经过上面3步,我们就可以在Android中使用lambda语法了,来看看效果:
    这里写图片描述

    当我们直接使用匿名内部类的时候,自动就提示我们lambda语法了。

  • 相关阅读:
    链接
    Java垃圾收集算法1
    Java基础知识常见面试题汇总第一篇
    Java基础知识
    线程间通信
    System.Span, System.Memory,还有System.IO.Pipelines
    微服务构件
    定位恶意软件
    Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)
    Spring MVC-处理程序映射(Handler Mapping)-控制器类名称处理程序映射(Controller Class Name Handler Mapping)示例(转载实践)
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329913.html
Copyright © 2011-2022 走看看