Vous devriez être en mesure d'obtenir ce que vous voulez en ligne en utilisant des moulages:
Stream.of("ciao", "hola", "hello")
.map(((Function<String, Integer>) String::length).andThen(n -> n * 2))
Il ne sont que « des conseils de type » pour le compilateur, donc ils ne sont pas réellement « jeter » l'objet et n'ont pas les frais généraux d'une distribution réelle.
Vous pouvez également utiliser une variable locale pour une meilleure lisibilité:
Function<String, Integer> fun = String::length
Stream.of("ciao", "hola", "hello")
.map(fun.andThen(n -> n * 2));
Une troisième façon qui peut être plus concis est une méthode utilitaire:
public static <T, X, U> Function<T, U> chain(Function<T, X> fun1, Function<X, U> fun2)
{
return fun1.andThen(fun2);
}
Stream.of("ciao", "hola", "hello")
.map(chain(String::length, n -> n * 2));
Veuillez noter que ceci n'est pas testé, donc je ne sais pas si l'inférence de type fonctionne correctement dans ce cas.
Indiquez l'entrée et la sortie désirée, puis expliquez comment implémenter des flux Java 8. – Alboz
Il n'est pas lié à Stream API son lié à la référence de méthode – rascio
la solution canonique est '.map (s -> s.length() * 2)' car il n'y a aucune raison de l'exprimer comme deux fonctions juste pour les combiner immédiatement. Si vous avez déjà une instance de 'Function' ou si vous voulez en garder au moins une pour la réutiliser plus tard, le problème n'existe pas car alors vous avez un objet que vous pouvez appeler' andThen' ou 'compose'. Dans tous les autres cas, il n'y a aucune raison de le faire aussi compliqué. – Holger