Ist es möglich, Parameter mit Methodenreferenz zu übergeben? Zum Beispiel muss ich eine TreeMap
aber unter Verwendungerstellen. Gibt es so etwas wie TreeMap::new(reverseOrder())
?Parameter in Methodenreferenz
Antwort
Nein, es mit einem Verfahren Verweise nicht tun können.
Sie können stattdessen Lambda-Ausdrücke verwenden:
() -> new TreeMap<TheRelevantType>(reverseOrder())
oder
() -> new TreeMap<>(reverseOrder())
, wenn Sie diesen Ausdruck in einem Kontext verwenden, wo der Compiler den Elementtyp des TreeMap
ableiten kann.
Rohe Typen, wirklich? – ZhekaKozlov
@ZhekaKozlov Guter Punkt, aber ohne den Kontext zu kennen, wusste ich nicht, welchen Elementtyp zu verwenden. – Eran
@Eran gibt es keinen Kontext, es war eine generische Situation –
Sie benötigen einen Lambda-Ausdruck für die ... Sie wahrscheinlich über ein Supplier
denken:
() -> new TreeMap<>(Comparator.reverseOrder())
Danke, ich stellte mir vor, dass es nicht möglich ist –
Dies wird von Methodenreferenzen selbst (heute) nicht unterstützt, aber es gibt viele Fälle, in denen Methodenreferenzen mit Parametern unter Verwendung der APIs Eclipse Collections verwendet werden können. Nehmen Sie das folgende Beispiel:
Map<String, TreeSet<String>> jdkMap = new HashMap<>();
jdkMap.put("one", new TreeSet<>(Comparator.reverseOrder()));
jdkMap.computeIfAbsent("two", key -> new TreeSet<>(Comparator.reverseOrder()));
MutableMap<String, TreeSet<String>> ecMap =
Maps.mutable.with("one", new TreeSet<>(Comparator.reverseOrder()));
ecMap.getIfAbsentPutWith("two", TreeSet::new, Comparator.<String>reverseOrder());
Assert.assertEquals(jdkMap, ecMap);
Hier vergleiche ich die Map.computeIfAbsent()
Methode des JDK, die eine Function
nimmt und den Schlüssel als Parameter übergeben, und Eclipse Collections' MutableMap.getIfAbsentPutWith()
Methode, die auch eine Function
nimmt und einen zusätzlichen Parameter übergeben . Im JDK-Beispiel muss ich ein Lambda verwenden. Im EG-Beispiel kann ich den Konstruktorreferenz TreeSet::new
verwenden und Comparator.<String>reverseOrder()
als den Parameter angeben, der an es übergeben werden soll.
Es gibt viele Methoden zur Verfügung *With
in Eclipse Sammlungen (z selectWith
, rejectWith
, collectWith
, detectWith
, anySatisfyWith
etc.). Diese Methoden erhöhen die Gesamtzahl der Stellen, die mit Methodenreferenzen in Java 8 verwendet werden können.
Sie finden Beispiele für Methodenreferenzen, die mit Parametern in den Katas der Eclipse-Sammlungen verwendet werden.
Company Kata -> Exercise 2 Test
Pet Kata -> Exercise 2 Test
Hinweis: Ich bin ein Committer für Eclipse Kollektionen.
Sie können in Java keine Methodenreferenzen mit Argumenten haben. Sie müssen einen Lambda-Ausdruck verwenden statt:
Supplier<Map<String, String>> factory =() ->
new TreeMap<>(Comparator.reverseOrder());
Aber wenn aus irgendeinem Grund, Sie wollen/müssen sowieso eine Methode Referenz verwenden, hier ist ein Weg, um es mit einem Helfer-Methode zu tun:
public static <T, U> Supplier<T> withArg(
Function<? super U, ? extends T> methodRef,
U arg) {
return() -> methodRef.apply(arg);
}
Supplier<Map<String, String>> factory = withArg(
TreeMap::new,
Comparator.<String>reverseOrder());
- 1. java8: Methodenreferenz von einer anderen Methodenreferenz
- 2. Kotlin: Methodenreferenz funktioniert nicht?
- 3. Lambda-Ausdruck oder Methodenreferenz?
- 4. SonarQube sieht keine Methodenreferenz
- 5. Lambda-Ausdruck vs Methodenreferenz
- 6. Java 8 verkettete Methodenreferenz?
- 7. java 8 Methodenreferenz hinter der Szene
- 8. Unterschied zwischen Methodenreferenz und Lambda
- 9. Wie behebe ich mehrdeutige Methodenreferenz?
- 10. parametrisierten Konstruktor als Methodenreferenz übergeben
- 11. Convert MethodHandle in Methodenreferenz (hier Funktion)
- 12. Java Methodenreferenz hier nicht erwartet
- 13. Methodenreferenz kompiliert nicht - Integer :: new
- 14. Nullprüfmethode mit java8 Methodenreferenz möglich?
- 15. Ersetzen von Lambda-Ausdruck mit Methodenreferenz
- 16. Eckige Ausführung übergeben Methodenreferenz im richtigen Kontext
- 17. Warum kompiliert diese Java 8 Methodenreferenz?
- 18. Verwenden von Methodenreferenz anstelle von Multiargument Lambda
- 19. Konstruktor Methodenreferenz für (nicht statische) innere Klasse?
- 20. C# -Timer mit Lambda anstelle der Methodenreferenz?
- 21. Binary Search Tree add Methodenreferenz verloren gehen
- 22. Android/Java - Methodenreferenz von der Liste entfernen
- 23. Holen Sie Klassenname von der statischen Methodenreferenz
- 24. Aufruf von toString über Methodenreferenz in Java 8
- 25. Warum benötigt die Methodenreferenz eine Typumwandlung in eine Funktionsschnittstelle?
- 26. Konvertieren Lambda mit Methodenreferenz auf Funktion in Java 7
- 27. Wie indirekt eine Methodenreferenz in Java 8 ausführen?
- 28. gibt es eine Lambda-Funktion, die keine Methodenreferenz sein kann
- 29. Gibt es eine Methodenreferenz, um eine Ausnahme auszulösen?
- 30. Erstellen einer Methodenreferenz für eine Nullreferenz löst keine Ausnahme aus
Eine Methodenreferenz ist eine Referenz zu einer vorhandenen Methode. Wenn es keine Methode gibt, die genau das tut, was Sie wollen, schreiben Sie entweder eine solche Methode (und erfassen Sie dann einen Verweis darauf) oder verwenden Sie ein Lambda, dessen Körper das tut, was Sie wollen. –
Auch [Externes Argument zur Methodenreferenz in Java 8] (https://stackoverflow.com/questions/38697939/external-argument-to-method-reference-in-java-8) und wahrscheinlich [viel mehr] (https : //stackoverflow.com/search?q = Parameter +% 22Methode + Referenz% 22) –