目次
はじめに
オブジェクトタイプ
Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
ログイン後にコピー
" >
Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
ログイン後にコピー
ホームページ Java &#&チュートリアル Java 8を使ったAndroidの新機能ラムダ式のサンプルコードを詳しく紹介

Java 8を使ったAndroidの新機能ラムダ式のサンプルコードを詳しく紹介

Mar 11, 2017 am 11:54 AM

はじめに

Java8の新機能であるラムダ式。 Lambda 式を使用すると、インターフェイスの実装を 1 つの関数だけで置き換えることができ、匿名の内部クラスに別れを告げることができ、コードはより簡潔で理解しやすくなります。
Java8 には他にもいくつかの新機能がありますが、Android では利用できない場合があります。
Studio 2.x 以降では jack コンパイラーがサポートされており、これを使用すると java8 の Lambda 式を使用できますが、他の機能が使用できるという保証はありません。

注: Android SDK には、JDK の一部のソース コードが統合されています。ネイティブ JDK の一部のクラスには、追加された新機能の実装が含まれている場合がありますが、Android のクラスには含まれていません。もう 1 つの例は、java8 の java.util.function パッケージです。これは、以前のバージョンでは使用できません。プラグイン Retrolambda を使用して、java8 の Lambda 式をサポートすることもできます。

ジャック構成

次の構成を追加

android {
    jackOptions {
        enabled true
    }
    compileOptions {//jack、retrolambda编译必需        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
ログイン後にコピー

して、ジャックコンパイラーがラムダ式をサポートできるようにします

最新バージョン2.3スタジオ、jdk 1.8環境、gradle2.3、および上記の構成を使用します

テスト後は、4.4 シミュレーターでも実行できます
構成デモ: http://www.php.cn/



retrolambda 構成

retrolambda は、Lambda 式を使用して Java5、6、および 7 と互換性があります。

構成は次のとおりです

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'me.tatarka:gradle-retrolambda:3.6.0'
    }}
apply plugin: 'me.tatarka.retrolambda'android {
    defaultConfig {
        minSdkVersion 11 //这个没有硬性要求
    }
    compileOptions {//jack、retrolambda编译必需
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }}
ログイン後にコピー

注: 多くのオープンソースプロジェクトは依然として Retrolambda を使用しています

ラムダ式の使用方法

まず第一に、知っておく必要があるのは、式が全体として、 『

オブジェクトタイプ

』。

最も単純な Lambda 式

コード:

Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
ログイン後にコピー

() は、実際には、ここにパラメータが渡されない場合、Runnable には void run() が 1 つしかないため、パラメータのないメソッドと一致します。ここにはメソッド名が記述されていないため、メソッド名は無視されます。

-> これにメソッド本体が続きます。ここには印刷コードが 1 つだけあり、メソッド本体の中括弧 {} は省略できます。

注: コンパイラーが自動型推論を実行するため、「new Runnable」などのコードはここでは省略されています。 () を直接呼び出すと、 -> System.out.println(“hi, I am stone”).run(); コンパイラは対応するメソッドを探すべきクラスを認識しないため、コンパイルされません

はい、パラメータと戻り値を含むラムダ式です

コード:

button.setOnTouchListener((view, event)-> {    
if (event.getAction() == MotionEvent.ACTION_DOWN) {        
if (flag) {            
return true;
        }
    }    return super.onTouchEvent(event);
});
ログイン後にコピー

パラメータがある場合は、パラメータ名を渡すだけです。名前は定義されていない場合は、コンパイラによって定義されます。自動的に推測してくれます。

戻り値がある場合は、メソッド本体で return を使用できます。次のように、コードが 1 つしかない場合は return を省略することもできます:

button.setOnTouchListener((v, e) -> super.onTouchEvent(e));
ログイン後にコピー

インターフェイスをカスタマイズして Lambda 式を使用します

最初にインターフェイスを定義します抽象メソッドを 1 つだけ使用します:

    interface IGetData<T> {//lambda只能用于单一方法类型匹配
        T get();//      T getOne(int i); //多个抽象方法,直接编译不过
    }
ログイン後にコピー

メソッドを定義し、パラメータは上で定義したインターフェイスです:

    void print(IGetData<String> data) {        
    String msg = data.get();        
    System.out.println(msg);
    }
ログイン後にコピー

ラムダ式をパラメータとして使用し、print() を呼び出します:

        print(() -> "张三");        print(() -> {
            System.out.println("干活了");            return "李四";
        });
ログイン後にコピー

出力:

03-08 06:46:00.430 1510-1510/? I/System.out: 张三
03-08 06:46:00.430 1510-1510/? I/System.out: 干活了
03-08 06:46:00.430 1510-1510/? I/System.out: 李四
ログイン後にコピー

ラムダ式を使用して、コマンダー パターン

コマンダー パターンの特徴と機能 簡単な実装プロセス:

コマンド インターフェイスは、コマンドを均一に実行するための抽象メソッドを定義します
  • それぞれの特定のコマンダーはコマンド インターフェイスを実装し、レシーバー オブジェクトに依存します。コマンドの実行プロキシは受信者に与えられます。
  • 呼び出し元クラスを実行するには、コマンドインターフェースによって実行されるコマンドインターフェースオブジェクトに依存します。 異なる特定のコマンダーをポリモーフィカルに渡し、最終的に受信側は異なる実行方法を採用します
  • 例 (オリジナルの実装)
たとえば、いくつかのファイル操作コマンドがあります: 開く、閉じる、保存、削除、受信側はエディターです

まず、コマンド インターフェイス IAction

public interface IAction {//原 命令者  抽象出一个 执行命令的方法
    void perform();
}
ログイン後にコピー

を定義し、次に 4 つの特定のコマンド クラス OpenAction、CloseAction、SaveAction、および DeleteAction を定義する必要があります。
CloseAction コード:

public class CloseAction implements IAction {
    private Editor mEditor;    
    public CloseAction(Editor editor) {        
    this.mEditor = editor;
    }    
    @Override
    public void perform() {        
    this.mEditor.close();
    }
}
ログイン後にコピー

他の 3 つの実装は CloseAction と似ています。

Editor クラス (レシーバー) は、4 つのコマンドを受信するそれぞれの具体的な実装を定義します。

public class Editor {     public void save() {
          System.out.println("save");
      }      public void delete() {
          System.out.println("delete");
      }      public void open() {
          System.out.println("open");
      }      public void close() {
          System.out.println("close");
      }
}
ログイン後にコピー

注: 異なるエディターにこれらのコマンドの異なる実装がある場合、IEditor をインターフェイスとして定義し、異なるエディターを実装することもできます。この点については詳しくは説明しません

最後に、呼び出し元があります。これはクラスにすることができます:

public class Invoker {  
    private IAction action;  

    public Invoker(IAction action) {  
        this.action = action;  
    }  

    public void invoke() {  
        this.action.perform();  
    }  
}
ログイン後にコピー
クライアントはコマンドを開始します:

Editor editor = new Editor();
new Invoker(new OpenAction(editor)).invoke();
new Invoker(new CloseAction(editor)).invoke();
new Invoker(new SaveAction(editor)).invoke();
new Invoker(new DeleteAction(editor)).invoke();
ログイン後にコピー

ここでの呼び出し元は、クラスを使用する代わりに定義できます。クライアント内:

private void invoke(IAction action) {
    action.perform();
}
ログイン後にコピー

client がコマンド呼び出しを開始します:

 invoke(new OpenAction(editor)); 
 invoke(new CloseAction(editor)); 
 invoke(new SaveAction(editor)); 
 invoke(new DeleteAction(editor));
ログイン後にコピー

ラムダ式の簡易バージョン

IAction、エディター、およびクライアントで呼び出し (Iaction アクション) を保持します。

クライアントはコマンド呼び出しを開始します:

  Editor editor = new Editor();
  invoke(() -> editor.open());  
  invoke(() -> editor.close());  
  invoke(() -> editor.save());  
  invoke(() -> editor.delete());
ログイン後にコピー

このように、Lambda式を使用した後、特定のコマンドクラスの定義は省略されます。また、最終的にどのメソッドが実行されたかが一目でわかります。

このように書くと、コマンダーモードのリクエストと実行の本来の分離が破壊されることになるので心配しないでください。

invoke(() -> editor.open()); <==>

invoke(new IAction() {    @Override
    public void perform() {
        editor.open();
    }
});
ログイン後にコピー

呼び出しクラス Invoker を保持すると、次の呼び出しのようになります:

new Invoker(() -> editor.open()).invoke();
ログイン後にコピー

以上がJava 8を使ったAndroidの新機能ラムダ式のサンプルコードを詳しく紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ラムダ式は C++ の例外をどのように処理しますか? ラムダ式は C++ の例外をどのように処理しますか? Apr 17, 2024 pm 12:42 PM

C++ では、Lambda 式を使用して例外を処理する方法が 2 つあります。try-catch ブロックを使用して例外をキャッチする方法と、catch ブロックで例外を処理または再スローする方法です。 std::function 型のラッパー関数を使用すると、その try_emplace メソッドで Lambda 式の例外をキャッチできます。

Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Apr 26, 2023 am 09:22 AM

Java8 は、minus() メソッドを使用して 1 年前の日付または 1 年後の日付を計算し、1 年前の日付を計算します。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDateprevious Year=today.minus(1,ChronoUni

C++ ラムダ式におけるクロージャの意味は何ですか? C++ ラムダ式におけるクロージャの意味は何ですか? Apr 17, 2024 pm 06:15 PM

C++ では、クロージャは外部変数にアクセスできるラムダ式です。クロージャを作成するには、ラムダ式の外部変数をキャプチャします。クロージャには、再利用性、情報の隠蔽、評価の遅延などの利点があります。これらは、イベント ハンドラーなど、外部変数が破棄されてもクロージャが外部変数にアクセスできる現実の状況で役立ちます。

マルチスレッド プログラミングに C++ ラムダ式を使用する利点は何ですか? マルチスレッド プログラミングに C++ ラムダ式を使用する利点は何ですか? Apr 17, 2024 pm 05:24 PM

C++ マルチスレッド プログラミングにおけるラムダ式の利点には、シンプルさ、柔軟性、パラメータの受け渡しの容易さ、並列処理が含まれます。実際のケース: ラムダ式を使用してマルチスレッドを作成し、異なるスレッドでスレッド ID を出力します。これは、このメソッドのシンプルさと使いやすさを示しています。

C++ラムダ式でクロージャを実装するにはどうすればよいですか? C++ラムダ式でクロージャを実装するにはどうすればよいですか? Jun 01, 2024 pm 05:50 PM

C++ ラムダ式は、関数スコープ変数を保存し、関数からアクセスできるようにするクロージャーをサポートしています。構文は [キャプチャリスト](パラメータ)->戻り値の型{関数本体} です。 Capture-list は、キャプチャする変数を定義します。[=] を使用してすべてのローカル変数を値によってキャプチャするか、[&] を使用してすべてのローカル変数を参照によってキャプチャするか、[variable1, variable2,...] を使用して特定の変数をキャプチャできます。ラムダ式はキャプチャされた変数にのみアクセスできますが、元の値を変更することはできません。

C++ ラムダ式はどのようにして外部変数をキャプチャするのでしょうか? C++ ラムダ式はどのようにして外部変数をキャプチャするのでしょうか? Apr 17, 2024 pm 04:39 PM

C++ で外部変数のラムダ式をキャプチャするには、次の 3 つの方法があります。 値によるキャプチャ: 変数のコピーを作成します。参照によるキャプチャ: 変数参照を取得します。値と参照による同時キャプチャ: 値または参照による複数の変数のキャプチャを許可します。

Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Apr 21, 2023 pm 11:01 PM

Java8 で 1 週間後の日付を計算する方法 この例では、1 週間後の日付を計算します。 LocalDate 日付には時間情報が含まれません。その plus() メソッドは、日、週、月を追加するために使用されます。これらの時間単位は ChronoUnit クラスで宣言されます。 LocalDate も不変型なので、戻った後に変数を使用して値を割り当てる必要があります。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

C++ 関数呼び出しのラムダ式: パラメーターの受け渡しと戻り値のコールバックの最適化 C++ 関数呼び出しのラムダ式: パラメーターの受け渡しと戻り値のコールバックの最適化 May 03, 2024 pm 12:12 PM

C++ では、ラムダ式を関数パラメータとして使用して、コールバック関数の柔軟性を実現できます。具体的には: パラメーターの受け渡し: std::function を介して Lambda 式をラップし、関数ポインターの形式で関数に渡します。戻り値の処理: std::functionでコールバック関数のポインタを宣言する際の戻り値の型を指定します。実践的なケース: GUI イベント処理のコールバックを最適化し、不要なオブジェクトや関数ポインターの作成を回避し、コードの単純さと保守性を向上させます。

See all articles