Android et Lambda

Je dois intégrer un code avec une utilisation étendue des fonctions Java lambda. Plusieurs restrictions, je demande que je développe mon projet en utilisant Eclipse Mars, avec le dernier plugin ADT, et pas Android Studio.

Le problème est que l'utilisation des fonctions Lambda requiert l'utilisation de la conformité 1.8 JDK, mais si cette option est définie, je reçois ce message:

  • Quelle est la différence entre ceci, getContext () et getActivity ()?
  • Ajouter gcm.jar dans Eclipse IDE (Google Cloud Messaging)
  • Comment lire des données à partir du fichier XLS (Excel)
  • ClassNotFoundException lors de la désinstallation: android.support.v4.view.ViewPager $ SavedState
  • Android, IntelliJ Idea, changer le type de module
  • Sqlite base de données de sécurité
  • Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. 

    Comment les deux peuvent-ils vivre ensemble en harmonie?

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

  • Android Studio: impossible de modifier les fichiers après un certain temps
  • Est-il toujours sécuritaire de lancer Context to Activity dans View
  • Android: AsyncTask recommandations: classe privée ou classe publique?
  • Comment on héritent des cours de test dans les modules de bibliothèque Android?
  • Déboguez le javascript dans l'émulateur d'Android avec la fonction phonegap
  • Comment puis-je utiliser une barre d'action contextuelle avec la bibliothèque de support Android?
  • 6 Solutions collect form web for “Android et Lambda”

    Comme l'a dit @dhke, il n'y a pas encore de support pour Java 8 sur Android.

    Utilisez 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é source à 6 ou 7 dépend 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 avez un usage étendu de lambda, Retrolambda pourrait être une option pour vous. Il fournit un backport de lambda pour les versions pré-Java 8. Il a un plugin Maven / Gradle / ligne de commande pour permettre le support.

    Autres Backports

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

    Vous ne pouvez actuellement pas (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!) (Libérer-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda) qu'aucun Dalvik ni ART ne supportent actuellement.

    On dirait que google pourrait avoir programmé (bien que rien ne semble être encore officiel) Prise en charge de Java 8 pour post 5.1.1 (API niveau 23 et versions ultérieures). Au moins, le désassemblant smali a déjà ajouté un support avec une référence distincte au niveau API:

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

    Ajouter un nouveau -X / – drapeau expérimental à [dis] assembler les opcodes non encore dans l'art

    • Ajouter de nouvelles opcodes libérer-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda
    • Ajouter un support pour l'encodage de 25x instructions
    • Ajoute LambdaTest pour vérifier les nouveaux codes d'optimaux assembler / démonter 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, et non la bibliothèque nécessaire. Il ne nous dit pas non plus rien sur Android lui-même, alors je suggérerais de ne pas prendre cela comme un calendrier de publication officiel.

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

    À partir de la version d' aperçu Android N, le support d'Android comporte des fonctionnalités limitées de Java 8, voir Java 8 Language Features

    Pour commencer à utiliser ces fonctionnalités, vous devez télécharger et configurer Android Studio 2.1 et Android N Preview SDK, qui comprend la trousse d'outils Jack requise et le plugin Android mis à jour pour Gradle. Si vous n'avez pas encore installé le SDK de prévisualisation d'Android N, consultez Configurer pour développer pour Android N.

    Fonctionnalités et API de langue Java 8 prises en charge

    Android ne supporte actuellement aucune fonctionnalité de langue Java 8. Cependant, les fonctionnalités suivantes sont maintenant disponibles lors du développement d'applications ciblant l'aperçu de l'Android N:

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

    Expressions Lambda

    Annulations répétées

    Il existe quelques fonctionnalités supplémentaires de Java 8 que le support d'Android, vous pouvez voir des détails complets à partir de Java 8 Language Features

    Je ne pense pas que ça va fonctionner.

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

    Notez que ceci n'est pas lié à l'habitude d'IntelliJ de penser qu'il sait mieux que vous, à quoi ressemble votre code. Il peut vous montrer un lambda, même si le code réel est une classe anonyme.

    Entrez la description de l'image ici

    Inverser la syntaxe Lambda

    Pour autant que je le sache, tout ce qui se fait dans la nouvelle syntaxe Java 8 Lambda peut être fait en utilisant le code Java de l'ancienne école, comme la classe interne anonyme. ( Didacticiel Oracel ) ( Oracle Quick Start )

    Pour alléger le fardeau de défaire la syntaxe Lambda, certains IDE tels que NetBeans peuvent suggérer une révision automatique du code dans l'une ou l'autre direction à partir de la syntaxe Lambda. Avec un seul clic d'approbation, la syntaxe est automatiquement échangée. Consultez le document NetBeans sur l' utilisation du support de Lambda Expressions .

    Voici une capture d'écran de NetBeans proposant d'activer Button.ClickListener d'un bouton Vaadin de la syntaxe Lambda à une classe interne anonyme. Notez le pointeur de la souris en cliquant sur l'icône de l'ampoule sur la ligne n ° 107.

    Capture d'écran de NetBeans proposant de passer la syntaxe Lambda à une classe interne anonyme

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

    Selon cet Android Developers Blogpost du 14 mars 2017, google

    A décidé d'ajouter une prise en charge des fonctionnalités de langage Java 8 directement dans les ensembles d'outils javac et dx actuels et déconseillent la chaîne d'outils Jack. Avec cette nouvelle direction, les outils existants et les plugins dépendants du format de fichier de classe Java devraient continuer à fonctionner. En avançant, les fonctionnalités de langage Java 8 seront supportées de manière native par le système de construction Android. Nous avons l'intention de lancer ceci dans le cadre d'Android Studio dans les prochaines semaines, et nous avons voulu partager cette décision plus tôt avec vous.

    Nous ne devrions probablement pas attendre beaucoup plus longtemps pour Java 8 dans Android Studio.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.