webentwicklung-frage-antwort-db.com.de

Android und Lambda

Ich muss etwas Code mit umfangreicher Verwendung von Java-Lambda-Funktionen integrieren. Einige Einschränkungen Ich habe verlangt, dass ich mein Projekt mit Eclipse Mars, mit dem neuesten ADT-Plugin und nicht mit Android Studio entwickle.

Das Problem ist, dass die Verwendung von Lambda-Funktionen die Einhaltung der JDK-Standards von 1.8 erfordert. Wenn dies jedoch festgelegt ist, erhalte ich die folgende Meldung:

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

Wie können die beiden in Harmonie zusammenleben?

Edit: Dies ist kein Duplikat der vorgeschlagenen Fragen, da ich nach ADT Eclipse frage, und seit dem letzten Update in dieser Frage unterstützt Android Java 8, also ist dies nicht nur ein Duplikat. aber diese Frage ist nun (nach 1,5 Jahren nach dem letzten Update) veraltet.

12
Ysch

Wie @dhke sagte, gibt es noch keine Unterstützung für Java 8 auf Android. 

Verwenden Sie Java 8, Build For Java 6/7

Sie können JDK 8 jedoch weiterhin verwenden, um eine Android-Anwendung zu entwickeln. Sie müssen lediglich die Quellkompatibilität auf 6 oder 7 einstellen, je nach minSDKVersion. So verlieren Sie alle in Java 8 eingeführten neuen Funktionen, wie z. B. Lambda in Ihrem Fall.

Rückhafen von Lamda

Da Sie Lambda ausgiebig verwenden, könnte Retrolambda eine Option für Sie sein. Es bietet einen Rückport von Lambda für Versionen vor Java 8. Es hat Maven/Gradle/Befehlszeilen-Plugin, um die Unterstützung zu aktivieren.

Andere Backports

Wenn Sie andere Java 8-Funktionen benötigen, bietet AFAIK ThreeTen ABP Backport-Unterstützung für Java 8 Date Time API.

10
Aaron He

Sie können derzeit (zumindest bis zu Android 5.1.1) keine Lambda-Funktionen unter Android verwenden.

Lambda-Funktionen erfordern neue Dalvik-Opcodes (nicht unbedingt JVM!) (Liberate-Variable, Box-Lambda, Unbox-Lambda, Capture-Variable, Create-Lambda, Aufruf-Lambda), die weder Dalvik noch ART derzeit unterstützen. 

Es sieht so aus, als hätte Google möglicherweise eine geplante Java 8-Unterstützung für Post 5.1.1 (API Level 23 und höher) geplant (obwohl noch nichts offiziell ist). Zumindest der smali disassembler hat bereits Unterstützung mit einem eindeutigen Verweis auf die API-Ebene hinzugefügt:

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

Fügen Sie die neue -X/- Experimentierflagge hinzu, um Opcodes, die noch nicht in der Kunst sind, zusammenzusetzen

  • Fügen Sie neue Opcodes hinzu: liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda
  • Unterstützung für das Kodieren von 25x-Anweisungen hinzufügen
  • Fügt LambdaTest hinzu, um zu überprüfen, ob neue Opcodes ordnungsgemäß zusammengebaut/zerlegt werden

Und auch

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

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

Dies kennzeichnet nur die Opcodes, nicht die notwendigen Bibliotheksänderungen. Es sagt uns auch nichts über Android selbst, also würde ich vorschlagen, dies nicht als offiziellen Veröffentlichungszeitplan zu betrachten.

6
dhke

Android unterstützt Java 8, also ist dies nicht nur ein Duplikat

AbAndroid N VorschauRelease Android Support limitiert Funktionen von Java 8 see Java 8 Sprachfunktionen

Um diese Funktionen nutzen zu können, müssen Sie Android Studio 2.1 und das Android N Preview-SDK, das die erforderliche Jack - Toolchain und das aktualisierte Android enthält, herunterladen und einrichten Plugin für Gradle. Wenn Sie Das Android N-Preview-SDK noch nicht installiert haben, lesen Sie Einrichten für die Entwicklung Für Android N .

Unterstützte Java 8-Sprachfunktionen und APIs

Android unterstützt derzeit nicht alle Java 8-Sprachfunktionen. Die folgenden Funktionen stehen jetzt jedoch zur Verfügung, wenn Apps Für Android N Preview entwickelt werden:

Standardmäßige und statische Schnittstellenmethoden

Lambda-Ausdrücke

Wiederholbare Anmerkungen

Es gibt einige zusätzliche Java 8-Funktionen, die Android unterstützt. Sie können vollständige Details von Java 8-Sprachfunktionen sehen.

3
user4774371

Ich glaube nicht, dass das funktionieren wird.

Um Lambdas verwenden zu können, benötigen Sie den Quellkompatibilitätsgrad 1.8. Damit der DEX-Compiler funktioniert, benötigen Sie die Zielkompatibilität 1.7. Mit Eclipse können Sie die Zielkompatibilität nicht unterhalb der Quellkompatibilität einstellen (Abbildung unten).

Beachten Sie, dass dies nichts mit IntelliJs Gewohnheit zu tun hat, zu glauben, es wüsste viel besser als Sie selbst, wie Ihr Code aussehen sollte. Es kann ein Lambda angezeigt werden, auch wenn der eigentliche Code eine anonyme Klasse ist.

 enter image description here

1
G. Blake Meike

UPDATE: Seit ein paar Tagen ist Android Studio 3.0 auf Stable unterwegs. Es unterstützt offiziell eine Teilmenge von Java 8-Funktionen, darunter Lambda-Ausdrücke .

Laut diesem Android-Entwickler-Blogpost vom 14. März 2017, google

beschloss, die Unterstützung für Java 8-Sprachfeatures direkt in die aktuellen Tools von javac und dx aufzunehmen und die Jack-Toolchain abzulehnen. Mit dieser neuen Ausrichtung sollten vorhandene Tools und Plugins, die vom Java-Klassendateiformat abhängig sind, weiterhin funktionieren. In Zukunft werden Java 8-Sprachfunktionen vom Android-Buildsystem nativ unterstützt. Wir beabsichtigen, dies in den kommenden Wochen als Teil von Android Studio zu starten, und wir wollten diese Entscheidung frühzeitig mit Ihnen teilen. 

Wir werden also wahrscheinlich nicht viel länger auf Java 8 in Android Studio warten müssen.

1
LPeteR90

Die Lambda-Syntax umkehren

Soweit ich weiß, kann alles, was in der neuen Java 8-Lambda-Syntax gemacht wird, mit altem Java-Code wie anonymer innerer Klasse ausgeführt werden. ( Oracel Tutorial ) ( Oracle Schnellstart )

Um die Belastung durch das Rückgängigmachen der Lambda-Syntax zu verringern, können einige IDEs wie NetBeans eine automatische Überarbeitung des Codes in/aus der Lambda-Syntax vorschlagen. Mit einem Klick wird die Syntax automatisch ausgetauscht. Siehe das NetBeans-Dokument unter Unterstützung von Lambda-Ausdrücken .

Hier ist ein Screenshot von NetBeans, das eine Vaadin button’s Button.ClickListener von der Lambda-Syntax in eine anonyme innere Klasse umwandelt. Beachten Sie, dass der Mauszeiger auf das Glühlampensymbol in Zeile 107 klickt.

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

Um diese Funktion in Ihrer IDE zu aktivieren, müssen Sie Java 8 in Ihrem Projekt vorübergehend aktivieren. Nachdem Sie die gesamte Lambda-Syntax rückgängig gemacht haben, wechseln Sie wieder zu Java 6/7. In NetBeans können Sie Java 8 in Ihrem Projekt> Properties > Sources > Source/Binary Format (popup menu) > 1.8 aktivieren.

0
Basil Bourque