web-dev-qa-db-ja.com

AndroidおよびLambda

Javaラムダ関数を多用するコードを統合する必要があります。 Android Studioではなく最新のADTプラグインを使用してEclipseMarsを使用してプロジェクトを開発することを要求するいくつかの制限があります。

問題は、Lambda関数を使用するには1.8 JDK準拠を使用する必要があることですが、そのように設定すると、次のメッセージが表示されます。

Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.

二人はどうやって調和して生きることができますか?

編集:これは、ADT Eclipseについて質問しているので、提案された質問の複製ではありません。その質問の最後の更新以降、AndroidはJava 8をサポートしているので、これだけではありません。重複していますが、その質問は現在(最後の更新から1。5年後)廃止されています。

12
Ysch

AndroidのJava 8言語機能の更新

Lambdaは古いバージョンのAndroidにバックポートされています。

これはAndroid Gradle Plugin 3.0以降の機能であり、ラムダは他のAndroid 8言語機能の一部として古いJava OSバージョンにバックポートされています。

これをGradleビルドスクリプトに追加して、機能を有効にします。

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

詳細については、 Java 8言語機能を使用 および Android 'Java 8サポート を参照してください。

@dhkeが言ったように、JavaではAndroid 8はまだサポートされていません。

Java 8を使用し、Java 6/7用にビルドします

ただし、JDK8を使用してAndroidアプリケーションを開発することはできます。 minSDKVersionに応じて、ソースの互換性を6または7に設定する必要があります。したがって、Java 8で導入された新機能、たとえばラムダは失われます。

ラムダのバックポート

ラムダを多用しているので、 Retrolambda が選択肢になるかもしれません。 Java8より前のバージョンのラムダのバックポートを提供します。サポートを有効にするためのMaven/Gradle /コマンドラインプラグインがあります。

その他のバックポート

他のJava 8機能、AFAIKが必要な場合、 ThreeTen ABP はJava 8 Date TimeAPIのバックポートサポートを提供します。

11
Aaron He

現在(少なくともAndroid 5.1.1)Androidでラムダ関数を使用することはできません。

Lambda関数には、DalvikもARTも現在サポートしていない新しいDalvik(必ずしもJVMではありません!)opcode(liberate-variable、box-lambda、unbox-lambda、capture-variable、create-lambda、invoke-lambda)が必要です。

グーグルがスケジュールしたようです(まだ公式なものはないようですが)Java 8ポスト5.1.1(APIレベル23以降)のサポート)少なくともsmali disassemblerAPIレベルへの明確な参照を含むサポートがすでに追加されています。

https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38

新しい-X/-experimentalフラグを追加して、まだアートにないオペコードを[分解]アセンブルします

  • 新しいオペコードを追加するliberate-variable、box-lambda、unbox-lambda、capture-variable、create-lambda、invoke-lambda
  • 25x命令のエンコードのサポートを追加
  • LambdaTestを追加して、新しいオペコードが正しくアセンブル/逆アセンブルされることを確認します

そしてまた

https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38#diff-5d7892344c0b747d3667bf8623c690c5R66

options.apiLevel = 23;  // since we need at least level 23 for lambda opcodes

これはオペコードのみをマークし、必要なライブラリの変更はマークしません。また、Android自体については何も教えてくれないので、これを公式のリリーススケジュールと見なさないことをお勧めします。

6
dhke

AndroidはJava 8をサポートしているので、これが重複していないだけではありません

現在Android NプレビューリリースAndroidサポート制限付き機能Java 8Java 8言語機能 を参照してください

これらの機能の使用を開始するには、 Android Studio 2.1 およびAndroid NプレビューSDK、必要な ジャック を含む)をダウンロードしてセットアップする必要があります。 =ツールチェーンと更新Android Gradle用プラグイン。Android NプレビューSDKをまだインストールしていない場合は、 開発のためのセットアップAndroid N

サポートされているJava 8つの言語機能とAPI

Androidは現在、すべてのJava 8言語機能をサポートしているわけではありません。ただし、Android Nプレビューを対象とするアプリを開発するときに、次の機能を利用できるようになりました。

デフォルトおよび静的インターフェイスメソッド

ラムダ式

繰り返し可能な注釈

いくつかの追加のJava 8つの機能がありますAndroidサポート、 Java 8言語機能 から完全な詳細を見ることができます

3
user4774371

これはうまくいかないと思います。

ラムダを使用するには、ソース互換性レベル1.8が必要です。 DEXコンパイラが機能するには、ターゲットの互換性1.7が必要です。 Eclipseでは、ターゲットの互換性をソースの互換性よりも低く設定することはできません(下の図)。

これは、コードがどのように見えるか、あなたよりもはるかによく知っていると考えるIntelliJの習慣とは無関係であることに注意してください。実際のコードが匿名クラスの場合でも、ラムダを表示できます。

enter image description here

1
G. Blake Meike

更新:数日後、 Android Studio 3.0は安定版になりましたJava 8機能のサブセット、それらの間のラムダ式 を公式にサポートします。

this Android Developers Blogpost 2017年3月14日、googleによると

Java 8言語機能のサポートを現在のjavacおよびdxツールセットに直接追加し、Jackツールチェーンを廃止することを決定しました。この新しい方向性により、Javaクラスファイル形式に依存する既存のツールとプラグインは引き続き機能するはずです。今後、Java 8言語機能は、Androidビルドシステムによってネイティブにサポートされる予定です。今後数週間でAndroid St​​udioの一部としてこれをリリースすることを目指しており、この決定を早い段階で皆さんと共有したいと思いました。

したがって、JavaStudioでAndroid8を待つ必要はおそらくありません。

1
LPeteR90

ラムダ構文を逆にする

私の知る限り、新しいJava 8 Lambda構文で行われることはすべて、匿名内部クラスなどの古い学校のJavaコードを使用して行うことができます。(- Oracelチュートリアル )( Oracleクイックスタート

Lambda構文を元に戻す負担を軽減するために、 NetBeans などの一部のIDEは、Lambda構文との間でコードの自動改訂を提案できます。承認を1回クリックするだけで、構文が自動的に魔法のように交換されます。 Lambda式サポートの使用 に関するNetBeansドキュメントを参照してください。

これは、 Vaadin ボタンの _Button.ClickListener_ をLambda構文から匿名内部クラスに変換するために提供しているNetBeansのスクリーンショットです。行#107の電球アイコンをクリックするマウスポインタに注目してください。

screenshot of NetBeans offering to switch Lambda syntax to an anonymous inner class

IDEでこの機能を有効にするには、プロジェクトでJava 8を一時的に有効にする必要があります。すべてのLambda構文を元に戻した後、プロジェクトをJava = 6 /7。NetBeansでJava 8を有効にする方法はプロジェクトにあります> Properties > Sources > Source/Binary Format (popup menu) > 1.8

0
Basil Bourque