2012-12-07 2 views
15

Je joue avec la version future de java 8 aka JDK 1.8.Lambda et génériques en Java 8

Et je trouve que vous pouvez facilement faire

interface Foo { int method(); } 

et de l'utiliser comme

Foo foo =() -> 3; 
System.out.println("foo.method(); = " + foo.method()); 

qui imprime simplement 3.

Et je trouve aussi qu'il ya un java. interface.fonction.fonction.Function qui fait cela d'une manière plus générique. Cependant ce code ne compilera pas

Function times3 = (Integer triple) -> 3 * triple; 
Integer twelve = times3.map(4); 

Et il semble que je dois d'abord faire quelque chose comme

interface IntIntFunction extends Function<Integer, Integer> {} 

IntIntFunction times3 = (Integer triple) -> 3 * triple; 
Integer twelve = times3.map(4); 

Je me demande s'il y a une autre façon d'éviter l'étape de IntIntFunction?

+6

'Mappeur times3' peut-être? –

+0

Bien sûr. Doh! –

+6

Maintenant que je commençais à comprendre les génériques, ils viennent avec CE: - (... – SJuan76

Répondre

5

@joop et @edwin merci. Basé sur la dernière version de JDK 8, cela devrait le faire.

IntFunction<Integer> times3 = (Integer triple) -> 3 * triple; 

Et au cas où vous ne l'aimez pas, vous pouvez le rendre un peu plus lisse avec quelque chose comme

IntFunction times3 = triple -> 3 * (Integer) triple; 

Vous n'avez pas besoin de spécifier un type ou entre parenthèses, mais vous aurez besoin de jeter le paramètre lorsque vous y accédez.

+0

Attendez, que fait le casting ici? à 'Integer' alors, au lieu de' int'? – sehe

+0

Je ne pense pas que (int) cast va compiler –

+0

Quelle est la différence entre IntFunction et la fonction ? – wensveen