1
votes

Trouvez l'élément correspondant dans 2 listes en utilisant le flux java 8 et en mettant à jour une valeur de liste à partir de l'autre

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


0 commentaires

4 Réponses :


0
votes

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());


1 commentaires

non cela ne remplace pas la liste comme ça.J'ai toujours ce avec quoi j'ai commencé dans la liste 1



0
votes

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


1 commentaires

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)



3
votes

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

Sortie

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()));


1 commentaires

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.



0
votes
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()+"]");
    }

0 commentaires