web-dev-qa-db-fra.com

Java utiliser la méthode void pour le mappage de flux?

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).

11
Nestor Milyaev

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;
29
Murat Karagöz

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;
7
Flown

Si vous êtes sûr que c'est ce que vous voulez faire, utilisez alors peek au lieu de map

7
Eugene