Androidは必ず-Android Studioの下でLambdaを構成し、使用することを知っています.

8733 ワード

モバイル側のアクセスが悪い場合は、->Github版にアクセスしてください.
背景
友人とJAVA8の新しい特性を討論して、Lambdaについて話して、ちょうど掘金の上で1篇の関連する文章を見て、資料を結びつけて、1つの総括をして、特に実際の使用の中で出会った問題を記録します.
Lambda式とは
Lambda式では、動作を関数に伝えることができます.Java 8以前に動作を関数に転送するには、匿名クラスのみを選択し、6行のコードが必要です.動作を定義する最も重要な行のコードは、真ん中に混じって強調されていません.Lambda式は匿名クラスの代わりにテンプレートをキャンセルし,関数スタイルでコードを記述できるようにした.これにより、可読性がより良く、表現がより明確になることがあります.
-Java 8 lambda式10例
上の文字を読み終わっても特に分かりませんが、私たちが日常的にAndroidを開発しているのは、匿名関数の使用を簡略化しているので、以下の例で簡単に感じることができます.もっと興味があれば、文末にもっと収集した資料を読むことができます.
Lamdbaの例
Lambda式によるRunnableの実装
lambda式を使用して匿名クラスを置き換えることができ、Runnableインタフェースを実装することは匿名クラスの最良の例である.Java 8以前のrunnable実装方法では,4行のコードが必要であったが,lambda式では1行のコードしか必要としなかった.匿名クラス全体を() -> {}コードブロックで置き換えるだけです.
// Java 8  :
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println(" Java8  ,        ");
    }
}).start();

//Java 8  :
new Thread( () -> System.out.println("  Java8, Lambda       ") ).start();

出力:
 Java8  ,        
  Java8, Lambda       

この例では、Java 8 lambda式の構文を示し、lambdaを使用して次のコードを書くことができます.
(params) -> expression
(params) -> statement
(params) -> { statements }

たとえば、パラメータを変更、書き換えずにコンソールで何かを印刷する方法であれば、次のように書くことができます.
() -> System.out.println("Hello World");

2つのパラメータをメソッドで受信する場合は、次のように書くことができます.
(int a, int b) -> a + b

Lambda式によるイベント処理
Androidの日常開発では、setOnClickListenersetOnItemClickListenerなど、さまざまなイベントを設定していますが、前後の書き方の変化を比較してみましょう.
//  
viewA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Do something
            }
        });
//  lambda
viewA.setOnClickListener(v -> {
  //Do something
});
//  
viewA.setOnClickListener(View v -> {
  //Do something
});

このような対比は簡潔で多いのではないでしょうか.では、複数のパラメータのsetOnItemClickListenerについてどう書きますか.
//  
xxxListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView> parent, View view, int position, long id) {
                //Do something
            }
});
//  lambda 
xxxListView.setOnItemClickListener((parent,view,position,id)->{
    //Do something
});
//  
xxxListView.setOnItemClickListener((AdapterView> parent, View view, int position, long id)->{
    //Do something
});
//  
xxxListView.setOnItemClickListener((a,b,c,d)->{
    //Do something
});

以上の2つの例は、日常のAndroid開発で最もよく使われている例ですが、Java 8 lambda式10の例にアクセスしてください.
Lambdaの有効化Lamdbaを有効にするには、Google公式を使用する方法と、サードパーティJava 8互換プラグインを使用する方法と、サードパーティ互換プラグインの使用を推奨する方法の2つがあります.
基本的な要件は次のとおりです.
  • Android Studio 2.1+
  • JAVA 8
  • を取り付ける
    方式1:Google公式方式
    新しいJava 8言語機能を使用するには、新しいJackツールチェーンも必要です.新しいAndroidツールチェーンはJavaソース言語をAndroid読み取り可能なDalvik実行可能ファイルバイトコードにコンパイルし、独自のものを持つ.jackライブラリフォーマットは、1つのツールでほとんどのツールチェーン機能を提供します.再パッケージ、圧縮、ぼかし、Dalvik実行可能ファイルパケットです.
    以下は、Android Dalvik実行可能ファイルを構築するために使用できる2つのツールチェーンの比較です.
    旧版javacツールチェーン:javac (.java --> .class) --> dx (.class --> .dex)新版Jackツールチェーン:Jack (.java --> .jack --> .dex) GradleプロジェクトにJava 8言語機能とJackを有効にするには、モジュールレベルのbuild.gradleファイルに次のように入力します.
    android {
      ...
      defaultConfig {
        ...
        jackOptions {
          enabled true
        }
      }
      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
      }
    }

    既知の問題Instant Runは現在Jackでは使用できません.新しいツールチェーンを使用すると無効になります.
    Java 8言語機能
    方式二:サードパーティJava 8互換プラグインの使用
    以下はプラグインのReadMeの構成です.プロジェクトのbuild.gradleファイルに次の内容を追加します.
    buildscript {
      repositories {
         mavenCentral()
      }
    
      dependencies {
         classpath 'me.tatarka:gradle-retrolambda:3.2.5'
      }
    }
    
    // Required because retrolambda is on maven central
    repositories {
      mavenCentral()
    }
    
    apply plugin: 'com.android.application' //or apply plugin: 'java'
    apply plugin: 'me.tatarka.retrolambda'

    本人のプロジェクトでは、多くの不要なエラーを回避するために、次のように構成されています.build.gradleファイルはプロジェクトルートディレクトリに1つあり、Moduleの下にも1つあります.
    /build.gradle
    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.2'
            classpath 'me.tatarka:gradle-retrolambda:3.2.5'
            classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
        }
        configurations.classpath.exclude group: 'com.android.tools.external.lombok'
    }
    
    allprojects {
        repositories {
            jcenter()
            mavenCentral()
        }
    }

    /app/build.gradle
    apply plugin: 'com.android.application'
    apply plugin: 'me.tatarka.retrolambda'
    
    android {
        ...
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }

    私が使用中にいくつかの構成が増えているのが見えますが、このプラグインのissueで調べました.構成の説明をよく読んで、実際のプロジェクトの特別なニーズに適応することをお勧めします.
    一般的なErrorおよび解決策
    Couldnot find property ‘options’ on task ‘:app:compileDebugJavaWithJack’.
    理由:Google公式方式を使うと互換性があり、Jackを使う時にAPTを同時に使うことができず、butterknife、Daggerなどを使うとAPTの注釈フレームワークが使えなくなる
    ソリューション:retrolambdaの互換プラグインを使用してlambdaを有効にする
    Doesn’t seem to correctly use modified lombok version
    理由:ここを参照
    解決策:私が書いたように、この問題は発生しません.
    まとめ
    味見したい開発者にとってLamdbaを有効にするのはいい選択ですが、結局これは徐々に普及していきます.Lamdbaの使い方をもっと知りたい人のために集めた資料と、本稿で参考にした文章を以下に示します.
  • jdk1.8新しい特性のlambda式およびAndroid Studioでの使用
  • Java 8 lambda式10例
  • Java 8チュートリアル
  • Error:Could not find property ‘options’ on task ‘:app:compileDebugJavaWithJack’.
  • Doesn’t seem to correctly use modified lombok version
  • retrolambdaプラグイン
  • PS:
    Github、CSDN、マイクロブログに注目してください.
    転載先:https://www.cnblogs.com/wuyida/p/6300459.html