2017-10-03 13 views
1

J'ai suivi le tutoriel this, écrit directement par google.Comment utiliser la nouvelle architecture Android sans utiliser Lambda Expressions?

Le problème, que j'ai actuellement, est la ligne userDao.save(response.body()); à l'intérieur de la classe UserRepository. Lorsque j'essaie de faire cela dans ma version Android Studio, je reçois un message qui dit que les expressions Lambda ne sont pas supportées à ce niveau de langue.

enter image description here

Je suis conscient du fait que je peux améliorer mon Android Studio pour soutenir Java 8 comme that, mais- est-il une autre façon de le faire? Je ne veux pas passer à Java 8 juste pour utiliser Lambda Expressions.

+0

Pourquoi quelqu'un * ne * voudrait-il pas passer à Java 8? Toutes les versions précédentes ont été End Of Life depuis des années maintenant! –

+0

@JoeC Ce n'est pas une exception qui est lancée, c'est un message de mon ide, mais merci pour votre réponse. – romaneso

+1

@JoeC parce que java 8 dans android est toujours en version bêta, et l'utilisation de la bêta me rend un peu tremblant – romaneso

Répondre

3

Si vous ne souhaitez pas utiliser Java 8 (que vous devriez revoir), vous pouvez remplacer manuellement:

executor.execute(() -> { 
    // task... 
}); 

avec:

executor.execute(new Runnable() { 
    @Override 
    public void run() { 
     // task... 
    } 
}); 
+1

Comment aurais-je pu être si aveugle?! Je n'ai pas vu que mon Runnable était le cours de lambda - en fait vous avez ouvert mes yeux et m'a aidé! Merci beaucoup! – romaneso

+1

pas de problème. vous pouvez utiliser un lambda à la place de toute classe interne anonyme, en particulier cliquez sur auditeurs: 'button.setOnClickListener (v -> {// code});' – chornge

+0

Ouais, j'étais au courant de cela, mais le fait que Android ne le fait pas le support java 8 (avec une release candidate) me fait sauter les lambas. – romaneso

4

En supposant que vous voulez utiliser lambda, ce est une réponse à deux options en fonction de votre version AS

2.3.3 et inférieure

D'abord, vous avez besoin Pour activer Jack et utiliser Java 8. Notez que jack est officiellement obsolète, mais pour AS 2.3.3 et plus bas, c'est la seule option pour obtenir Java 8 (option vraiment buggy cependant. Lambda peut être utilisé dans Java 7 (ou inférieur) à l'aide d'une bibliothèque, décrite à la fin de cette publication):

android { 
    ... 
    defaultConfig { 
     ... 
     jackOptions { 
      enabled true 
     } 
    } 

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

3,0 (bêta lors de l'écriture ce) et au-dessus

AS 3.0 supporte java 8 sans besoin d'activer Jack. Donc, tout ce dont vous avez besoin est:

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
} 

En supposant que vous avez Java 8 installé, vous pouvez maintenant utiliser lambda.

L'autre solution de contournement (si vous ne pouvez pas obtenir Java 8 pour compiler ou ne pas vouloir traiter avec jack ou toute autre raison) est comme chornge dit dans sa réponse de ne pas utiliser lambda ou Java 8 et juste utiliser le système de classe interne anonyme.

Alternative

D'un côté note, vous avez écrit dans votre message que vous ne voulez pas utiliser Java 8, mais utilisez lambda. Vous pouvez (en théorie, ne l'ai pas testé moi-même) utiliser retrolambda. C'est une bibliothèque qui ajoute le support lambda pour Java < = 7

+0

Jack est déprécié, tandis que Retrolambda fonctionne parfaitement bien. – EpicPandaForce

+0

Je sais que jack est déprécié, c'est toujours la seule option pour obtenir Java 8 sur AS <= 2.3.3. AS> = 3.0 autorise Java 8 sans jack. Sur les versions inférieures d'AS, vous devez toujours utiliser la prise même si elle est déconseillée (j'ai essayé d'utiliser Java 8 sans prise en utilisant AS 2.3.3, mais cela montre que la prise est toujours nécessaire). Il est seulement dans 3.0 jack est devenu obsolète – Zoe

+0

Retrolambda vous donne également un soutien lambda. Et cela ne casse pas les choses dans le processus. Donc, je recommande de ne pas appliquer jack. C'est officiellement obsolète. http://tools.android.com/tech-docs/jackandjill – EpicPandaForce