1. lambda表達式在android中的妙用
@[toc]
::輸出的時候使用
-> 傳遞值的時候使用
對應lambda
x -> body
對應lambda
(x, y) -> x + y;
對應lambda
(int x, int y) -> x + y;
() -> {}
(x, y) -> x + y;
3)單行需要有返回值
(x, y) -> x + y//注意沒有分號結尾
(x, y) ->{
x x;
y y;
}
(x, y) ->{
x x;
y y;
return x + y;
}
(1)list在forEach中使用lambda
(2)map在forEach中使用lambda
2. android如何使用lambda表達式
在java8之前,Java並不支持Lambda表達式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表達式需要進行一些處理,將Lambda表達式編譯成Android可以「理解」的方式。
Retrolambda是一個能夠讓我們在Java7中使用Lambda的工具,再通過gradle-retrolambda插件,在gradle編譯過程中將會:
將Java8中的 javac編譯 Java8的代碼;
將產生的Java8的位元組碼轉換為Java6的位元組碼;
重新打包class。
build.gradle配置文件如下:
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:1.2.+'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
也可以添加如下設置:
retrolambda {
jdk System.getenv("JAVA8_HOME")
javaVersion JavaVersion.VERSION_1_6
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
從此以後,
strings.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.length();
}
});
可以寫作:
strings.map((String s) -> {
return s.length();
});
至於詳細的bytecode轉換過程,有興趣的同志們可以自己研究研究。
3. 如何Android Studio里使用lambda表達式
Lambda表達式是在JDK8中開始支持的一種函數式推導語言,能夠大量減少匿名內部類那種冗餘的代碼。在Android中,可以大量使用在設置監聽,設置非同步回調等場景。
目前Android開發已經漸漸到從Eclipse的ADT遷移到了AndroidStudio,但是AndroidStudio目前的版本還沒有直接支持Lambda表達式的支持,需要插件支持,當然,JDK版本也必須使用JDK8或者以上(當然過些時間會有更高版本的JDK)。
1.引入retrolambda插件:
在Project的build.gradle中添加
applyplugin:『me.tatarka.retrolambda『
2.設置編譯選項(可能也可以不寫)
在Project的build.gradle的android節點中添加如下代碼
compileOptions{
.VERSION_1_8
.VERSION_1_8
}
3.引入retrolambda的類路徑,在Mole:app的build.gradle中的buildscript->dependencies節點中添加如下代碼
classpath『me.tatarka:gradle-retrolambda:3.2.0『
4.對build.gradle進行build
5.編寫測試代碼,簡單寫法如下
[java]viewplain
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.text);
textView.setOnClickListener(v->Toast.makeText(getApplicationContext(),"Lambda",Toast.LENGTH_LONG).show());
}
6.運行查看是否正常
詳細一點為:
AndroidStudio默認使用Lambda表達式是會報錯的,即使你使用的是Java8,為了在androidstudio中使用lambda表達式,我們必須藉助一個插件retrolambda,該插件將Java8中的lambda表達式特性兼容到java5。使用它也很簡單。
首先先項目根目錄下的build.gradle中加入
[java]viewplain
<codeclass="hljs">classpath'me.tatarka:gradle-retrolambda:3.2.0'</code>
最終整個文件會像這樣子
[java]viewplain
<codeclass="hljs">buildscript{
repositories{
jcenter()
}
dependencies{
classpath'com.android.tools.build:gradle:1.2.3'
classpath'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects{
repositories{
jcenter()
}
}
</code>
然後再mole目錄下的build.gradle中使用插件,加入
[java]viewplain
<codeclass="hljs">applyplugin:'me.tatarka.retrolambda'</code>
並且在android節點下加入
[java]viewplain
<codeclass="hljs">compileOptions{
sourceCompatibility<atarget="_blank"href="
(51,51,51);text-decoration:none;font-size:14px;background:none">Java</a>Version.VERSION_1_8
.VERSION_1_8
}</code>
最終整個文件就像這樣子
[java]viewplain
<codeclass="hljs">applyplugin:'com.android.application'
applyplugin:'me.tatarka.retrolambda'
android{
compileSdkVersion22
buildToolsVersion22.0.1
defaultConfig{
applicationIdcn.e.zafu.rxdemo
minSdkVersion15
targetSdkVersion22
versionCode1
versionName1.0
}
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
compileOptions{
.VERSION_1_8
.VERSION_1_8
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
compile'com.android.support:appcompat-v7:22.2.0'
}
</code>
現在讓我們試試lambda表達式,就拿View的點擊事件做實驗吧。
在使用lambda表達式之前是這樣子的
[java]viewplain
<codeclass="hljs">btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show()
}
});</code>
使用了lambda表達式之後是這樣子的
[java]viewplain
<codeclass="hljs">btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(v->Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show()
);</code>
好了,運行一下項目,如果點擊按鈕出現了Toast說明你成功了,但是如果你運行出現ClassNotFound的錯誤的話clean一下項目,再編譯運行,就能成功運行了。
怎麼樣,有沒有發現代碼精簡了許多。這篇文章算是開始RxJava(RxAndroid)的學習之路的第一篇博文吧,畢竟RxJava大量使用了lambda表達式特性。雖然也可以不用lambda表達式,但是使用了lambda表達式後會顯得代碼特別精簡。
來自zzh1026it的博客分享
4. 如何Android Studio里使用lambda表達式
Android Studio默認使用Lambda表達式是會報錯的,即使你使用的是Java 8,為了在android studio中使用lambda表達式,我們必須藉助一個插件retrolambda ,該插件將Java 8中的lambda表達式特性兼容到java 5。使用它也很簡單。
首先先項目根目錄下的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()
}
}
然後再mole目錄下的build.gradle中使用插件,加入
apply plugin: 'me.tatarka.retrolambda'11
並且在android節點下加入
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}12341234
最終整個文件就像這樣子
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "cn.e.zafu.rxdemo"
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'
}
現在讓我們試試lambda表達式,就拿View的點擊事件做實驗吧。
在使用lambda表達式之前是這樣子的
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_LONG).show()
}
});12345671234567
使用了lambda表達式之後是這樣子的
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(v -> Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_LONG).show()
);123123
好了,運行一下項目,如果點擊按鈕出現了Toast說明你成功了,但是如果你運行出現ClassNotFound的錯誤的話clean一下項目,再編譯運行,就能成功運行了。
例子、源碼、文檔全部搞定,採用androidstudo的目錄結構,360手機助手中下載。下面是截圖。
5. Android studio中怎麼操作lambda
首先明確lambda表達式他是一個匿名函數,通常可以表示閉包。在Android studio中操作lambda表達式主要有以下幾步:
在Gradle(Project)中添加:(classpath:classpath 'me.tatarka:gradle-retrolambda:3.2.0')如圖所示:
6. 如何Android Studio里使用lambda表達式
Lambda表達式是Java 8的一個新特性,可以替代只有一個函數的介面實現,告別匿名內部類,代碼看起來更簡潔易懂。Lambda表達式同時還提升了對集合的迭代、遍歷、過濾數據的操作。那麼在Android Studio中如何使用lambda表達式呢?
項目使用的jdk要為jdk 8或更高版本
然後在項目中就可以愉快使用lambda表達式了,大家感受下:
public class TestActivity extends BaseActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.test);
findViewById(R.id.button1).setOnClickListener(view -> onButton1());
findViewById(R.id.button2).setOnClickListener(view -> onButton2());
} public void onButton1() {
Runnable runnable = () -> Toast.makeText(this, "abcd", Toast.LENGTH_SHORT).show();
runnable.run();
} public void onButton2() {
Observable.from(Arrays.asList(1, 2, 3, 4, 5))
.filter(integer -> integer % 2 == 0)
.map(integer -> integer * integer)
.subscribeOn(Schelers.io())
.observeOn(AndroidSchelers.mainThread())
.subscribe(integer -> Toast.makeText(this, String.valueOf(integer), Toast.LENGTH_SHORT).show());
}
}