J'ai deux listes d'objets. Besoin de parcourir les deux, de les faire correspondre par identifiant, puis de mettre à jour les valeurs de la liste 1 de cet objet à partir de la liste 2 si l'identifiant correspond.
Je sais comment le faire avec l'ancien java mais je me demande si cela peut être fait en JAVA8 (flux)
private void upsertAttributes(CartItem cartItem, Optional<CartItem> existingCartItem) { boolean addAtribute = true; List<CartItemAttribute> existingAttribute = existingCartItem.get().getAttributes(); for (CartItemAttribute requestingList: cartItem.getAttributes()) { addAtribute = true; for (CartItemAttribute existingList: existingAttribute) { if(StringUtils.isNotBlank(requestingList.getCartItemAttributeId()) && requestingList.getCartItemAttributeId() .equals(existingList.getCartItemAttributeId())) { existingList.setKey(requestingList.getKey()); existingList.setValue(requestingList.getValue()); addAtribute = false; } } if(addAtribute) { existingAttribute.add(requestingList); } } }
voulant le résultat final comme celui-ci
List<CartItemAttribute> test = existingCartItem.get().getAttributes().stream() .filter(x -> (cartItem.getAttributes().stream() .filter(y->y.getCartItemAttributeId()== x.getCartItemAttributeId()) .count()<1 )).collect(Collectors.toList());
en gros, je veux si l'ID correspond, je veux que les valeurs soient remplacées de la liste2 à la liste 1 (je ne veux pas de la liste 3)
jusqu'à présent, j'ai pu les faire correspondre par ID, mais je ne sais pas comment mettre à jour le champs ...
list1 = {p1,p2, p3, p10} p1:{1,test1,33} p2:{2,test22,16} p3:{3,test3,18} p10:{10,test10,8}
voici ce que j'ai qui fonctionne comme prévu
class Person { String id ; String name; String age; } p1:{1,test1,3} p2:{2,test2,6} p3:{3,test3,8} p4:{1,test1,33} p5:{2,test22,16} p6:{3,test3,18} p10:{10,test10,8} List<Person> list1 = {p1,p2, p3, p10}; List<Person> list2 = {p4,p5, p6};
4 Réponses :
Vous pouvez réaffecter la liste en faisant:
list1 = existingCartItem.get().getAttributes().stream() .filter(x -> (cartItem.getAttributes().stream() .filter(y->y.getCartItemAttributeId()== x.getCartItemAttributeId()) .count()<1 )).collect(Collectors.toList());
non cela ne remplace pas la liste comme ça.J'ai toujours ce avec quoi j'ai commencé dans la liste 1
Vous pouvez implémenter la mise à jour sur place de la première liste en utilisant replaceAll
comme:
list1.replaceAll(l1Person -> list2.stream() .filter(l2Person -> l2Person.getId().equals(l1Person.getId())) .findAny() .orElse(l1Person));
Merci pour la réponse. cela a résolu mon 1 problème où je remplace les données de list2 par la liste 1 lorsque l'id correspond. mais il n'ajoute pas les données de list2 à list1 lorsque l'id ne correspond à aucun des identifiants (et il a vérifié toutes les données de la liste 2)
Essayez ceci
[ Person(id=1, name=test1, age=33), Person(id=2, name=test22, age=16), Person(id=3, name=test3, age=18), Person(id=10, name=test10, age=8), Person(id=4, name=test4, age=15) ]
getPersonList1
[ Person(id=1, name=test1, age=33), Person(id=2, name=test22, age=16), Person(id=3, name=test3, age=18), Person(id=4, name=test4, age=15) ]
getPersonList2 p>
[ Person(id=1, name=test1, age=3), Person(id=2, name=test2, age=6), Person(id=3, name=test3, age=8), Person(id=10, name=test10, age=8) ]
List1
private static List<Person> getPersonList2() { return Lists.newArrayList( new Person("1", "test1", "33"), new Person("2", "test22", "16"), new Person("3", "test3", "18"), new Person("4", "test4", "15") ); }
List2 strong>
private static List<Person> getPersonList1() { return Lists.newArrayList( new Person("1", "test1", "3"), new Person("2", "test2", "6"), new Person("3", "test3", "8"), new Person("10", "test10", "8") ); }
Liste finale1
List<Person> list1 = getPersonList1(); List<Person> list2 = getPersonList2(); list1.replaceAll(l1 -> list2.stream() .filter(l2 -> l2.getId().equals(l1.getId())) .findAny() .orElse(l1)); list1.addAll(list2.stream() .filter(l2 -> !list1.contains(l2)) .collect(toList()));
J'ai dû changer un peu car le modèle vérifiait tout au lieu des identifiants et je ne voulais pas mettre à jour cela. mais cela a fonctionné. merci beaucoup de m'avoir appris comment faire cela.
existingCartAttributes.replaceAll(l1 -> requestingCartAttributes.stream() .filter(l2 -> l2.getCartItemAttributeId().equals(l1.getCartItemAttributeId())) .findAny() .orElse(l1)); System.out.println("*********************************"); for (CartItemAttribute var: existingCartAttributes) { System.out.println("[" +var.getCartItemAttributeId() + "] [" + var.getKey() + "] [" +var.getValue()+"]"); } System.out.println("*********************************"); existingCartAttributes.addAll(requestingCartAttributes.stream() .filter(l2 -> StringUtils.isBlank(l2.getCartItemAttributeId())) .collect(Collectors.toList())); for (CartItemAttribute var: existingCartAttributes) { System.out.println("[" +var.getCartItemAttributeId() + "] [" + var.getKey() + "] [" +var.getValue()+"]"); }