2012-12-07 14 views
15

Ich spiele mit Future Java 8 Release alias JDK 1.8.Lambdas und Generika in Java 8

Und ich fand heraus, dass man leicht

interface Foo { int method(); } 

tun können, und verwenden Sie es wie

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

die einfach druckt 3.

Und ich fand auch, dass es ein Java ist. util.function.Function-Schnittstelle, die dies in einer allgemeineren Weise tut. Allerdings wird dieser Code nicht

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

kompilieren Und es scheint, dass ich zum ersten Mal

interface IntIntFunction extends Function<Integer, Integer> {} 

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

So etwas wie

zu tun haben, ich frage mich, ob es einen anderen Weg, um die IntIntFunction Schritt zu vermeiden?

+6

'Mapper mal3' vielleicht? –

+0

Natürlich. Do! –

+6

Nun, da ich anfing, Generika zu verstehen, kommen sie mit THIS: - (... – SJuan76

Antwort

5

@joop und @edwin danke.

Basierend auf der neuesten Version von JDK 8 sollte dies tun.

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

Und falls Sie nicht wie Sie es ein bisschen mehr glatt mit so etwas wie

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

machen Sie müssen also keinen Typ oder Klammern angeben, aber Sie werden werfen müssen der Parameter, wenn Sie darauf zugreifen.

+0

Warte, was macht die Besetzung da? Wäre es" Triple ", Objekt zu sein? Empfiehlst du Casting? zu "Integer" dann, anstelle von "int"? – sehe

+0

Ich glaube nicht, (Int) Cast wird kompiliert. –

+0

Was ist der Unterschied zwischen IntFunction und Funktion ? – wensveen