Bei der Suche nach einer Lösung für das parametrisierte Supplier
Problem fand ich die obigen Antworten hilfreich und wandte die Vorschläge an:
private static <T, R> Supplier<String> failedMessageSupplier(Function<String,String> fn, String msgPrefix, String ... customMessages) {
final String msgString = new StringBuilder(msgPrefix).append(" - ").append(String.join("\n", customMessages)).toString();
return () -> fn.apply(msgString);
}
Es wird folgendermaßen aufgerufen:
failedMessageSupplier(String::new, msgPrefix, customMsg);
Noch nicht ganz zufrieden mit dem reichlich vorhandenen statischen Funktionsparameter, habe ich weiter gegraben und mit Function.identity () zu folgendem Ergebnis gekommen:
private final static Supplier<String> failedMessageSupplier(final String msgPrefix, final String ... customMessages) {
final String msgString = new StringBuilder(msgPrefix).append(" - ").append(String.join("\n", customMessages)).toString();
return () -> (String)Function.identity().apply(msgString);
};
Aufruf jetzt ohne den statischen Funktionsparameter:
failedMessageSupplier(msgPrefix, customMsg)
Da Function.identity()
eine Funktion des Typs zurückgegeben Object
wird und auch der nachfolgende Aufruf von apply(msgString)
, ist eine Umwandlung in String
erforderlich - oder was auch immer der Typ ist, mit apply () wird gefüttert.
Diese Methode ermöglicht beispielsweise die Verwendung mehrerer Parameter, die dynamische Zeichenfolgenverarbeitung, Zeichenfolgenkonstantenpräfixe, Suffixe usw.
Die Verwendung von Identität sollte theoretisch auch einen leichten Vorteil gegenüber String :: new haben, wodurch immer ein neuer String erstellt wird.
Wie Jacob Zimmerman bereits betonte, ist die einfachere parametrisierte Form
Supplier<Foo> makeFooFromString(String str1, String str2) {
return () -> new Foo(str1, str2);
}
ist immer möglich. Ob dies in einem Kontext sinnvoll ist oder nicht, hängt davon ab.
Wie auch oben beschrieben, erfordern statische Methodenreferenzaufrufe die Anzahl und Art der Rückgabe / Parameter der entsprechenden Methode, um mit denen übereinzustimmen, die von der funktionsaufwendigen (Stream-) Methode erwartet werden.