Android學習探索之Java 8 在Android 開發中的應用

前言:

  Java 8推出已經將近2年多了,引入不少革命性變化,加入了函數式編程的特徵,使基於行爲的編程成爲可能,同時減化了各類設計模式的實現方式,是Java有史以來最重要的更新。可是Android上,一直沒有看到支持Java8的消息。Android到底會不會支持Java8呢?答案是確定的,Android N已經開始支持Java 8 了。java

關於Java 8

(1.)使用Lambda表達式

   Java 8的一大亮點是引入Lambda表達式,使用它設計的代碼會更加簡潔。當開發者在編寫Lambda表達式時,也會隨之被編譯成一個函數式接口。android

(2.)引入函數式接口

1.)第一步,安裝Java8,並指定項目使用Java8,minSdkVersion <24 只能使用Java8 的 Lambda特性,minSdkVersion>= 24可使用Java8特性,因而可知所有普及Java8仍是須要必定時間的

2.)第二步在module的build.gradle中添加相關配置

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

我這裏使用的Android studio 2.2.2版本 Android版本爲24,若是是低於24版本的話是沒法使用Java 8特性的。若是僅僅只想使用lambda表達式的話徹底夠用了,咱們只需把minSdkVersion設爲14便可。web

如下是我本身的設置範例express

android {
    compileSdkVersion 24
    buildToolsVersion '24.0.2'
    defaultConfig {
        applicationId "com.whoislcj.jsbridge"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dexOptions {
        incremental true
    }

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

關於Lambda

   「Lambda 表達式」(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。編程

如何使用Java 8 Lambda表達式?

1.)使用Lambda表達式示例

這裏以常見的Java匿名內部類爲例設計模式

(1.)未使用lambda表達式以前閉包

1     findViewById(R.id.to_web).setOnClickListener(new View.OnClickListener() {
2             @Override
3             public void onClick(View v) {
4                 Toast.makeText(MainActivity.this, "終於等到你", Toast.LENGTH_LONG).show();
5             }
6         });

(2.)使用lambda表達式

1      findViewById(R.id.to_web).setOnClickListener((View v) -> {
2             Toast.makeText(this, "終於等到你", Toast.LENGTH_LONG).show();
3         });

(3.)進一步簡化

1 findViewById(R.id.to_web).setOnClickListener(v -> Toast.makeText(this, "終於等到你", Toast.LENGTH_LONG).show());

 2.)擴展知識

  在Android studio 2.1 版本要想實現Lambda表達式的話能夠採用第三方AS retrolambda插件來實現,github地址:https://github.com/evant/gradle-retrolambda,一樣那種方式僅僅支持lambda表達式而不支持Java8特性。

目前碰見的問題

 1.)中文亂碼問題

這個問題我一直覺得是編碼問題,後來才發現是jackOptions {enabled true}引發的中文亂碼,解決辦法在project的gradle.properties中添加以下代碼

org.gradle.jvmargs=-Dfile.encoding=UTF-8

 2.)Instant Run 目前不能用於 Jack,目前建議暫時關閉Instant Run使用。

總結:

   本文僅僅是學習瞭如何使用在Android 開發中使用Java8的lambda表達式來使代碼變得簡潔,借來會逐步對Java的一些特性進行學習。

相關文章
相關標籤/搜索