如何在android module中使用Java 8的新特性,比如Lambda

 我来答
好程序员
2017-03-19 · HTML5前端培训/大数据培训/Java
好程序员
好程序员是IT高端课程培训基地,从平凡到卓越,为梦想而拼搏。
向TA提问
展开全部

概述

lambda和Stream表达式是java8引入的新特性,要理解lambda表达式,其中最重要的概念就是函数式接口(functional interface),而在Android中有很多这种接口,如点击事件OnclickListener等。简单来说,函数式接口是只包含一个抽象方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。

来看一下lanbda语法,以java.util.Comparator接口为例

使用Rxjava的朋友,肯定对这种语法很熟悉。lanbda更多特性参照 
Java 8 Tutorial

retrolambda

在android 中磨人是不支持java8的,那么该如何使用呢,在android中我们必须借助一个插件retrolambda@[Github],该插件将Java 8中的lambda表达式特性兼容到java 5。 
引入步骤

download and install java8

在project的build.gradle中加入

classpath 'me.tatarka:gradle-retrolambda:3.2.0'11

完整代码:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}

allprojects {
repositories {
jcenter()
}
}123456789101112131415123456789101112131415

在module的build.gradle中使用插件

apply plugin: 'me.tatarka.retrolambda'11

在android节点下加入环境支持

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

完整代码:

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"

defaultConfig {
applicationId "com.bobomee.android.lambda.sample"
minSdkVersion 15
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:22.2.0'

}123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930

Stream

同时Stream API让我们对于集合的操作也变得十分的简洁

Stream.of(/* array | list | set | map | anything based on Iterator/Iterable interface */)
.filter(..)
.map(..)
...
.sorted()
.forEach(..);
Stream.of(value1, value2, value3)...
Stream.ofRange(0, 10)...1234567812345678

具体可参考:Lightweight-Stream-API@[Github] 
Java 8 Stream on Android

测试

imageView.post(()-> Toast.makeText(this,"lambda-test",Toast.LENGTH_LONG).show());       11

这里模拟了Runnable接口,如果打出toast,则说明引入成功了,否则clean或者同步一下工程即可。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式