是时候用Java 8了

  • 先下载 java8 sdk,并且配置完成

  • app/build.gradle



    • 开启jack编译选项

    • 设置编译选项兼容到1.8

示例如下

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.lufei.java8"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"

        //开启jack编译
        jackOptions { enabled true }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //指定java8
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

如果JDK不能用1.8, 那可以使用Android studio插件 Gradle Retrolambda Plugin

lambda示例:

原来的代码如下:

textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "test java8", Toast.LENGTH_SHORT).show()
        }
    });

采用lambda后:

textView.setOnClickListener(view -> Toast.makeText(MainActivity.this, "test java8", Toast.LENGTH_SHORT).show());

如果要将原来的代码转成lambda语法,可以鼠标移到代码位置,按 alt+Enter 会提示 Replace with lambda

lambda的表达式格式通常为

//省略参数类型
 (arg1,arg2...) -> {body} 

//指定参数类型 
(Type1 arg1,Type2 arg2...)->{body}

lambda表达式的结构

  • 参数可以是零个或多个 参数类型可指定,可省略(根据表达式上下文推断)

  • 参数包含在圆括号中,用逗号分隔

  • 表达式主体可以是零条或多条语句,包含在花括号中

  • 表达式主体只有一条语句时,花括号可省略

  • 表达式主体有一条以上语句时,表达式的返回类型与代码块的返回类型一致

  • 表达式只有一条语句时,表达式的返回类型与该语句的返回类型一致

另外,函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法), 见Java8之默认方法和静态接口方法

接口中可以定义静态方法和默认方法, 默认方法的关键字为 default

不过截止发稿,开启jackOptions之后,Instant Run就不支持了

所以可以使用插件Gradle Retrolambda Plugin,按照官方提示配置, 然后把jackOptions { enabled true }去掉即可,这样就既可以使用lambda 又支持instant run了

参考文章:

http://www.imooc.com/article/9303

标签: none

评论已关闭