Al buscar una solución al Supplier
problema parametrizado , encontré útiles las respuestas anteriores y apliqué las sugerencias:
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);
}
Se invoca así:
failedMessageSupplier(String::new, msgPrefix, customMsg);
Aún no muy satisfecho con el abundante parámetro de función estática, investigué más y con Function.identity () , obtuve el siguiente resultado:
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);
};
Invocación ahora sin el parámetro de función estática:
failedMessageSupplier(msgPrefix, customMsg)
Dado que Function.identity()
devuelve una función del tipo Object
, y también lo hace la llamada posterior de apply(msgString)
, String
se requiere una conversión a , o cualquiera que sea el tipo, se está alimentando apply ().
Este método permite, por ejemplo, usar múltiples parámetros, procesamiento dinámico de cadenas, prefijos de constantes de cadena, sufijos, etc.
Teóricamente, el uso de la identidad también debería tener una ligera ventaja sobre String :: new, que siempre creará una nueva cadena.
Como ya señaló Jacob Zimmerman, la forma parametrizada más simple
Supplier<Foo> makeFooFromString(String str1, String str2) {
return () -> new Foo(str1, str2);
}
siempre es posible. Si esto tiene sentido o no en un contexto, depende.
Como también se describió anteriormente, las llamadas de referencia de métodos estáticos requieren que el número del método correspondiente y el tipo de retorno / parámetros coincidan con los esperados por el método que consume funciones (flujo).