这一段时间看了Java 8上的函数式编程,于是想在Anroid上也通过Java 8来编写应用。不过目前Android只支持Java 7。Java 8中的lambda以及stream等等都不能应用。

不过总归是有有缘人将这部分特性带到了Anroid开发上。

retrolambda

retrolambda是一个可以让Java 8之前版本也能应用lambda表达式的库。它带来了lambda表达式、函数引用以及try-with-resources语句的支持。

在Anroid Studio中配置retrolambda

  • 修改Anroid Studio项目工程下的build.gradle文件,增加classpath 'me.tatarka:gradle-retrolambda:3.1.0'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'me.tatarka:gradle-retrolambda:3.1.0'
    }
}
  • 修改app/build.gradle文件,增加如下内容
apply plugin: 'me.tatarka.retrolambda'

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    retrolambda {
        javaVersion JavaVersion.VERSION_1_6
    }
}

在代码中使用lambda表达式

在进行如上配置之后,代码中就可以直接使用lambda表达式了,比如注册按钮点击事件,

view.setOnClickListener(view -> Toast.makeText(context, "hello lambda", Toast.LENGTH_SHORT).show());

stream support

retrolambda并没有引入Java 8中的stream接口,不过在其项目页面上给出了一个支持stream的项目链接,streamsupport

通过使用streamsupport这个包,在Android代码中也可以使用Stream接口,不过和Java 8的Stream接口相比,还是有些地方有出入。

import java8.util.stream.Collectors;
import java8.util.stream.StreamSupport;

...

StreamSupport.of(1, 2, 3).map(x -> x + 1).collect(Collectors.toList());

除了streamsupport这个库之外,另外也发现一个项目做了类似的事情,Lightweight Stream API

总结

有些事情如果大厂做了,那么能惠及所有人。但如果他们没做,也总归会有有缘人出来把这个事情做了。

Google已经宣布不再支持Eclipse ADT了,Android Studio终于能够作为官方钦定的开发工具了。不过自己对Gradle这个东西一直都没能熟悉起来,看来是有必要仔细学习下。略微跑题,anyway,折腾一番后总算在Android上愉快的使用lambda与stream了。

参考