2017-06-20 46 views
15

This question ma teraz ponad 3 lata i dotyczy konkretnie Javy 8, z zaakceptowaną odpowiedzią również cytując numer Java SE 8 Final Specification.Czy będzie możliwe opisanie wyrażenia lambda w Java 9?

Byłbym zainteresowany, gdyby coś w tym pytaniu zmieniło się w Javie 9: Czy istnieje sposób na opisanie wyrażenia lambda podobnego do opisywania odpowiedniej anonimowej klasy?


Przykład:

Adnotacja:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE_USE) 
public @interface MyTypeAnnotation { 
    public String value(); 
} 

adnotacja Praca anonimowych Klasa:

Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() { 
    @Override 
    public void accept(String str) { 
     System.out.println(str); 
    } 
}; 

adnotacji wyrażenie Lamba, obecnie nie działa w Java 8:

Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p)); 
+0

Jedną z istotnych różnic między tymi dwoma konstrukcjami jest to, że anonimowa klasa nadal jest deklaracją klasy.Wyrażenie lambda nie tworzy nowej klasy (lub niekoniecznie, jeśli jest to szczegół implementacji). Mam wrażenie, że adnotacje są dozwolone tylko w * deklaracjach *. Czy adnotacje są dozwolone w * wyrażeniach *? – Lii

Odpowiedz

13

Istnienie pytania Stackoverflow nie jest wystarczające, aby wskazać, że taka funkcja jest planowana, nawet, że ktoś jest zawsze biorąc pod uwagę go.

Jeśli spojrzysz na list of JEPs, zobaczysz, że nie ma takiego JEP, nawet w stanie roboczym, sugerującym taką funkcję.

Ponadto, jeśli spojrzysz na bieżący stan środowiska Java LambdaMetafactory, zobaczysz, że nie wprowadzono żadnych zmian w celu obsługi przekazywania informacji meta, które byłyby konieczne do wygenerowania klasy środowiska wykonawczego z zarejestrowanymi danymi adnotacji.

Wydaje się, że istnieje chęć dodania wielu meta-informacji do tego, co właściwie powinno być małym kawałkiem kodu wyrzucanego, ale wątpię, aby projektant języka podążył za nim. Wyrażenia Lambda mają na celu zdefiniowanie funkcji, która nie jest alternatywnym sposobem opisywania anonimowej klasy. Ewolucja długoterminowa raczej doprowadzi do implementacji ekspresji lambda, które są jeszcze mniej zwykłą klasą.

+2

'... są jeszcze mniej zwykłej klasy' Nie mogę się doczekać, aby tak się stało i zmian, które byłyby wymagane do tego – Eugene

7

Według strony What's new in Oracle JDK 9, No. To nie zmieniło się w Javie 9.

oczywiście, że nie jest ostateczne, ale JLS Java 9 nie został jeszcze wydany.

6

to ciekawe, że robią opisywanie wewnętrzną klasę, która „reprezentuje” wyrażenia lambda w InnerClassLambdaMetafactory.spinInnerClass poprzez:

mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true) 

Ale to jest opisywanie klasę oczywiście, a nie lambda per se.

adnotacji lambda wymagałoby zmian w invokedynamic i niejawnie LambdaMetafactory miarę widzę - i co się stanie, kiedy invokedynamic nie utworzyć klasę dla lambda, ale coś innego, co by się stało, do tych adnotacji?