Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
Java 8を使ったAndroidの新機能ラムダ式のサンプルコードを詳しく紹介
はじめに
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
}
}
ログイン後にコピー
して、ジャックコンパイラーがラムダ式をサポートできるようにします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 は、Lambda 式を使用して Java5、6、および 7 と互換性があります。
retrolambda 構成
構成は次のとおりです
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 つだけあり、メソッド本体の中括弧 {} は省略できます。 Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();
注: コンパイラーが自動型推論を実行するため、「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);
});
ログイン後にコピー
パラメータがある場合は、パラメータ名を渡すだけです。名前は定義されていない場合は、コンパイラによって定義されます。自動的に推測してくれます。 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 式を使用します
interface IGetData<T> {//lambda只能用于单一方法类型匹配
T get();// T getOne(int i); //多个抽象方法,直接编译不过
}
ログイン後にコピー
メソッドを定義し、パラメータは上で定義したインターフェイスです: 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(() -> { 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 と似ています。
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(); }
invoke(new OpenAction(editor)); invoke(new CloseAction(editor)); invoke(new SaveAction(editor)); invoke(new DeleteAction(editor));
Editor editor = new Editor(); invoke(() -> editor.open()); invoke(() -> editor.close()); invoke(() -> editor.save()); invoke(() -> editor.delete());
invoke(() -> editor.open()); <==>
invoke(new IAction() { @Override public void perform() { editor.open(); } });
呼び出しクラス Invoker を保持すると、次の呼び出しのようになります:
new Invoker(() -> editor.open()).invoke();
以上がJava 8を使ったAndroidの新機能ラムダ式のサンプルコードを詳しく紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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