2016-07-27 5 views
14

私は、だから、これは24未満のAndroid APIでJava 8機能インタフェースを使用する方法はありますか?

myButton.setOnClickListener(view -> Timber.d("Lambdas work!")); 

これも

Runnable runLater =() -> Timber.d("Lambdas work!"); 
runLater.run(); 

を動作しますが、この1つはない

Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i); 
runLaterWithInt.accept(3); 

んが作品のAndroid APIレベルでラムダを有効にするためにretrolambdaを使用することができます最後はAndroid APIレベル24で動作しますが、他のデバイスではこのコードがクラッシュします

retrolambdaを使用する代わりに、Java 8を有効にしようとしました。最初の2つのコード例がまだ機能していますが、バターナイフは動作を停止しました。ここhttps://developer.android.com/preview/j8-jack.html#configurationava.util.functionがサポートされるように言ったが、第三いずれかを実行しているとき、私はまだクラッシュを取得され、この時間は、

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1 
+1

[Java 8はAndroid api 23以上で動作しますか?](http://stackoverflow.com/questions/35934528/does-java-8-work-on-android-api-23-and-上記の質問) –

+2

質問のタイトルが不十分です。ラムダは実際に古いAndroidバージョンにバックポートされているので、Retrolambdaは必要ありません。新しいAndroid Studioとビルドツールをインストールするだけです。 –

+1

おそらくそれはタイトルが不十分です。私はAndroid N SDKを持っていて、ジャックのコンパイルオプションを有効にしていれば、私はretorlambdaは必要ないと理解しています。ラムダはどちらの方法でも動作します。しかし、 'java.util.function'からの機能的なインタフェースはまだありません。 – sasha199568

答えて

7

それでもこの質問への回答が必要な場合は必ず、他の人(私のような)かもしれないわけではありません。

バージョン3.0では、Androidスタジオnatively supports lambda functionsと他の多くのJava 8の機能がすべてのAPIレベルで機能していますが(機能的インタフェースやjava.util.functionなど)、API 24+に制限されています。

サポートが拡張されるまで、android-retrostreamsはほとんどの場合バックポートをサポートします。このプロジェクトは、streamsupport libraryの「アップグレードされたポート」です。このプロジェクトは、アンドロイドレトロストリームでも使用でき、多くの機能を備えています。ストリームサポートライブラリはJava 6/7までサポートしていますので、AS 3.0以降またはJava 8をターゲットにしていなくても使用できますが、ほとんどの場合、アンドロイドレトロストリームを使用するほうが良いでしょう。あなたはできる。プロジェクトのjavadocを使って、提供されているものを正確に見ることができますが、私が使ったハイライトはjava.util.functionjava.util.Comparatorです。

パッケージ名のjavajava9に置き換えられ、クラス名やメソッド名の一部が少し変更されている可能性があります。例えば:

java.util.Comparatorjava9.util.Comparators( - 同じ機能とわずかに異なるメソッド名及びコールパターンに)なるが

java.util.functionjava9.util.function

なります。

+3

あなたはJava 7のOracle/OpenJDK VMを念頭に置いています。それは、現時点で提供されていたJavaのバージョンに関係なく、APIレベル15または14までのAndroidデバイスで動作します*提供されます* Android Studio 3.xおよびJava 8の機能を使用して、 Android Studio 2.3.xで動作します)。実際のJava 6/7 VM(Sunなど)で実際に動作するStream APIバックポートが必要な場合は、[streamsupport](https://sourceforge.net/projects/streamsupport/)を使用する必要があります。 – Sartorius

+0

ああ、私の悪い。 'android-retrostreams'のreadmeは、Java 6のサポートを落としただけで、Java 8を明示的にターゲットにしていなくてもAndroid Studioでも使えるように聞こえました。ちょうどそのために、私は説明のために編集します。 – VerumCH

+0

Android Studio 3.xで対象とするJavaのバージョンはどのように重要ですか?結局のところ、あなたのアプリが動いているかどうかを決める* minSDKVersion *です。マシュマロと言いましょう。混乱を避けるために、* minSDKVersion = 23 *(Marshmallow)とし、Android Studio 3.xでJava 8をターゲットにして、 'android-retrostreams'を使用すれば問題ありません。私が言っているのは、 'android-retrostreams' ** jar **ファイルはJava 7 Standard Edition VM(Oracle、IBMのJRE)で動かすことができないということです。 – Sartorius

-1

のJava 8の機能のインターフェイスはAndroid用の以前のバージョンで実行するために有効にすることができる少し異なっていますJack Toolchainを有効にします。あなたのbuild.gradleファイルに次のコード行を追加することでこれを行うことができます。

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

あなたはそれがまだJava 8では動作しないことができるので、あなたがインスタント実行を無効にする必要があることに注意しなければならないが。

また、Androidの開発者チャンネルからこのビデオからより多くの情報を見つけることができます。https://www.youtube.com/watch?v=zfLKMun94Yc&index=10&list=PLWz5rJ2EKKc9tH0dRV1_HmQBXe_-qFQPl

は、私はそれが行く方法を知ってみましょう。

+3

確かに、それはそのように動作します。しかし、誤解を避けるために、パッケージjava.util.functionからの機能インタフェースはまだ利用できないことに言及するべきである。 – Sartorius

+0

AndroidはAPIがiOSよりも低ければラムダをサポートしていますが、これは機能的なインターフェイスでは機能しません – York

+0

ジャックのツールチェーンは廃止されました(https://developer.android.com/studio/preview/features/java8-support .html) – nyconing

0
allprojects { 
    repositories { 
     maven { url 'https://jitpack.io' } 
    } 
} 
dependencies { 
     compile 'com.github.ipcjs:java-support:0.0.3' 
} 

コード:ipcjs/java-support

+2

これは何で、なぜそれが助けになるのですか? – lucidbrot

+0

@lucidbrot [the resp](https://github.com/ipcjs/java-support)のREADME.mdを参照してください。 – ipcjs

+1

@jpcjsはい、私はすでにそれを見てきましたが、それはあまりドキュメントではありません。私の質問は残っています^^これは何ですか?アンドロイドの完全なコピー?それはなぜ機能するのですか? – lucidbrot

関連する問題