Disons que j'ai une méthode void qui fait juste une transformation sur un objet, sans retourner de valeur, et je veux l'utiliser dans un contexte de fonction map map (), comme ceci:
public List<MyObject> getList(){
List<MyObject> objList = ...
return objList.stream().map(e -> transform(e, e.getUuid())).collect(Collectors.toList());
}
private void transform(MyObject obj, String value){
obj.setUuid("prefix" + value);
}
L'exemple est fait pour plus de simplicité - la méthode actuelle fait autre chose que de nettoyer le UUID d'un objet.
Quoi qu'il en soit, comment est-il possible d'utiliser une méthode void dans un scénario comme celui ci-dessus? Certes, je pourrais faire en sorte que la méthode retourne l'objet transformé, mais c'est en dehors du point et viole la conception (la méthode devrait être nulle).
On dirait que c'est un cas d'utilisation forcée de Java 8 stream. Au lieu de cela, vous pouvez le réaliser avec forEach.
List<MyObject> objList = ...
objList.forEach(e -> transform(e, e.getUuid()));
return objList;
En plus de la réponse d'Eugène vous pouvez utiliser Stream::map
comme ça:
objList.stream()
.map(e -> {
transform(e, e.getUuid());
return e;
}).collect(Collectors.toList());
En fait, vous ne voulez pas transformer vos éléments actuels et les collecter dans un nouveau List
.
Au lieu de cela, vous souhaitez appliquer une méthode pour chaque entrée de votre List
.
Par conséquent, vous devez utiliser Collection::forEach
et retourne le List
.
List<MyObject> objList = ...;
objList.forEach(e -> transform(e, e.getUuid()));
return objList;
Si vous êtes sûr que c'est ce que vous voulez faire, utilisez alors peek au lieu de map