web-dev-qa-db-fra.com

Android et Lambda

J'ai besoin d'intégrer du code avec une utilisation intensive des fonctions Java lambda. Plusieurs restrictions m'obligent à développer mon projet à l'aide d'Eclipse Mars, avec le dernier plugin ADT et non Android Studio.

Le problème est que l'utilisation des fonctions Lambda exige l'utilisation de la conformité JDK 1.8, mais si cette option est définie, le message suivant s'affiche:

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

Comment les deux peuvent vivre ensemble en harmonie?

Edit: Ce n’est pas un duplicata des questions suggérées, comme je le demande à propos de ADT Eclipse, et depuis la dernière mise à jour de cette question, Android prend en charge Java 8; mais cette question est maintenant (après 1,5 ans après la dernière mise à jour) obsolète.

12
Ysch

Comme @dhke l'a dit, Java 8 sur Android n'est pas encore pris en charge. 

Utiliser Java 8, Build For Java 6/7

Mais vous pouvez toujours utiliser JDK 8 pour développer une application Android. Il vous suffit de définir la compatibilité de la source sur 6 ou 7, en fonction de votre minSDKVersion. Ainsi, vous perdriez toutes les nouvelles fonctionnalités introduites dans Java 8, comme lambda dans votre cas.

Backport de Lamda

Puisque vous utilisez beaucoup de lambda, Retrolambda pourrait être une option pour vous. Il fournit un backport de lambda pour les versions antérieures à Java 8. Il a Maven/Gradle/plugin en ligne de commande pour activer le support.

Autres backports

Si vous avez besoin d'autres fonctionnalités de Java 8, AFAIK, ThreeTen ABP fournit un support de backport pour l'API Java 8 Date Time.

10
Aaron He

Vous ne pouvez pas actuellement (comme au moins Android 5.1.1) utiliser les fonctions lambda sur Android.

Les fonctions Lambda nécessitent de nouveaux opcodes Dalvik (pas nécessairement JVM!) (Liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda) que ni Dalvik ni ART ne prennent actuellement en charge. 

Il semblerait que Google ait planifié (bien que rien ne semble encore officiel) le support de Java 8 pour post 5.1.1 (API de niveau 23 et supérieur). Au moins le smali désassembleur déjà ajouté, une prise en charge avec une référence distincte au niveau de l'API:

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

Ajoute le nouveau drapeau -X/- expérimental pour [désassembler] les opcodes pas encore dans l'art

  • Ajouter de nouveaux opcodes liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda
  • Ajout du support pour l'encodage des instructions 25x
  • Ajoute LambdaTest pour vérifier les nouveaux opcodes à assembler/désassembler correctement

Et aussi

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

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

Cela ne marque que les opcodes, pas les modifications de bibliothèque nécessaires. De plus, cela ne nous dit rien sur Android lui-même, donc je suggérerais de ne pas prendre cela comme un calendrier de sortie officiel.

6
dhke

Android prend en charge Java 8, donc non seulement ce n'est pas un doublon

À partir dePrévisualisation Android Nlibération du support Android limitée fonctionnalités de Java 8 voir Fonctionnalités du langage Java 8

Pour commencer à utiliser ces fonctionnalités, vous devez télécharger et configurer Android Studio 2.1 et le kit de développement logiciel Android N Preview, qui inclut le Requis Jack toolchain et la mise à jour Android. Plugin pour Gradle. Si vous n'avez pas encore installé le SDK Android N Preview, voir Configurer le développement Pour Android N .

Fonctions et API du langage Java 8 pris en charge

Actuellement, Android ne prend pas en charge toutes les fonctionnalités du langage Java 8. Cependant, les fonctionnalités suivantes sont désormais disponibles lors du développement d'applications Ciblant l'Aperçu Android N:

Méthodes d'interface statique et par défaut

Expressions lambda

Annotations répétables

Il existe certaines fonctionnalités Java 8 supplémentaires prises en charge par Android. Vous pouvez voir les détails complets dans Fonctionnalités du langage Java 8

3
user4774371

Je ne pense pas que ça va marcher.

Pour utiliser lambdas, vous avez besoin du niveau de compatibilité source 1.8. Pour que le compilateur DEX fonctionne, vous avez besoin de la compatibilité de la cible 1.7. Eclipse ne vous laissera pas définir la compatibilité cible en dessous de la compatibilité source (image ci-dessous).

Notez que cela n’est pas lié à l’habitude d’IntelliJ de penser qu’elle sait beaucoup mieux que vous, à quoi votre code devrait ressembler. Il peut vous montrer un lambda, même lorsque le code réel est une classe anonyme.

 enter image description here

1
G. Blake Meike

MISE À JOUR: Depuis quelques jours, Android Studio 3.0 est stable . Il supporte officiellement un sous-ensemble de fonctionnalités Java 8, expressions lambda entre elles .

Selon ce développeur Android Blogpost à partir du 14 mars 2017, google

a décidé d'ajouter le support des fonctionnalités du langage Java 8 directement dans les outils actuels javac et dx, et de rendre obsolète la chaîne d'outils Jack. Avec cette nouvelle direction, les outils et plug-ins existants dépendant du format de fichier de classe Java devraient continuer à fonctionner. À l'avenir, les fonctionnalités du langage Java 8 seront nativement prises en charge par le système de génération Android. Nous avons l'intention de lancer ceci dans le cadre d'Android Studio dans les semaines à venir, et nous voulions vous faire part de cette décision rapidement. 

Nous n’allons donc probablement pas attendre beaucoup plus longtemps pour Java 8 dans Android Studio.

1
LPeteR90

Inverser la syntaxe Lambda

Autant que je sache, tout ce qui est fait dans la nouvelle syntaxe Java 8 Lambda peut être fait en utilisant du code Java old-school tel que la classe interne anonyme. ( Didacticiel Oracel ) ( Démarrage rapide d'Oracle )

Pour alléger la tâche qui consiste à annuler la syntaxe Lambda, certains IDE tels que NetBeans peuvent suggérer une révision automatique du code dans un sens ou dans l’autre à la syntaxe Lambda. D'un seul clic d'approbation, la syntaxe est automatiquement remplacée par magie. Voir le document NetBeans sur Utilisation de la prise en charge des expressions lambda .

Voici une capture d’écran de NetBeans qui propose de transformer la syntaxe Lambda d’un bouton { Vaadin } _ _ ( Button.ClickListener } en une classe interne anonyme. Remarquez le pointeur de la souris en cliquant sur l’icône de l’ampoule de la ligne 107.

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

Pour activer cette fonctionnalité dans votre IDE, vous devez activer Java 8 temporairement dans votre projet. Après avoir annulé toute la syntaxe Lambda, rétablissez votre projet en Java 6/7. Dans NetBeans, la manière d'activer Java 8 est dans votre projet> Properties > Sources > Source/Binary Format (popup menu) > 1.8.

0
Basil Bourque