Java 8 peek vs carte

J'ai le cas suivant: il y a une liste d'objets - ProductData qui contient plusieurs champs:

public class ProductData
{
....
  private String name;
  private String xref;

  //getters
  //setters
}

et il y a de l'API qui retourne la liste des objets suivants:

public class RatingTableRow
{
  private String planName;
  private String planXref;
  private int fromAge;
  private int toAge;
  private int ratingRegion;

 //constructor
 //getters
 //setters

}

mais il renvoie des objets vides champ nom du plan, car il n'est pas permis, lors de l'extraction de cet objet. J'ai besoin de lien de données du produit avec RatingTableRow par le xref afin de définir un nom dans le RatingTableRow parce que j'ai besoin pour utiliser cet objet, plus tard, j'ai donc créé à la suite du code pour le faire:

Map<String, ProductData> productByXref = plans.stream()
        .collect(toMap(ProductData::getInternalCode, Function.identity()));

return getRatingTableRows(...).stream
        .filter(ratingRow -> productByXref.containsKey(ratingRow.getPlanXref()))
        .peek(row -> {
                ProductData product = productByXref.get(row.getPlanXref());
                row.setPlanName(product.getName());
        })....;

Je sais que java docs disent que peek ne convient pas à ces besoins, mais que vous voulez obtenir vos suggestions sur la façon d'effectuer cette tâche en plus de façon correcte.

  • Que diriez - map ou forEach et return row; dans la fonction?
  • Si vous souhaitez modifier des objets existants, je pense que foreach est le meilleur choix.
  • pouvez-vous expliquer pourquoi foreach est le mieux pour cette tâche?
  • Parce que foreach s'applique un peu de code pour chaque élément de la liste, un peu comme un vieux style foren boucle. Mais je viens de remarquer ceux ... après peek; est-il plus du stream? foreach est un terminal de flux de l'opération, dans ce cas, peek pourrait en effet être la meilleure façon. BTW, c'est quoi la méthode censé return?
  • Euh, je ne pense pas que l'œil est mauvais ici. carte non plus.
  • ... mais encore une fois, dans ce cas, vous pourriez vouloir diviser le flux. Réglez d'abord le plan de noms avec foreach, et puis lisez à nouveau sur la liste fixe et de faire tout ce qui s'en vient. Notez que maintenant, tout ce qui vient après peek également être appliqués que sur les éléments qui passent à la filter. Vous ne savez pas si c'est volontaire.
  • En fait, j'ai utilisé ce code comme certains l'API pour une autre partie de l'application et de la faire revenir flot des nouvelles de filtrage/carte chaînes peuvent être ajoutées.
  • Peut-être que vous devriez nous dire: pourquoi avez-vous choisi d'utiliser peek, en dépit de l'avertissement dans la documentation, au lieu d'utiliser le terminal de l'opération forEach qui est la bonne manière d'appliquer une opération à chaque élément d'un flux. Quels sont vos besoins, que ce code ne nous dites pas que.
  • Donc, comme je l'ai mentionné plus tôt, je l'ai utilisé dans certains autres endroits, et a décidé de flux retour. Dans un autre endroit, j'ai ajouté le filtrage d'appel donc, actuellement, il ressemble à une chaîne d'exécutions.

InformationsquelleAutor Alex | 2017-06-05