web-dev-qa-db-fra.com

Modifier la valeur de propriété des objets de la liste à l'aide de flux Java 8

J'ai une liste d'objets Fruit dans arraylist et je souhaite modifier fruitName en son nom au pluriel . Voir l'exemple:

@Data
@AllArgsConstructor
@ToString
class Fruit {

    long id;
    String name;
    String country;
}

List<Fruit> fruits = Lists.newArrayList();
fruits.add(new Fruit(1L, "Apple", "India"));
fruits.add(new Fruit(2L, "Pineapple", "India"));
fruits.add(new Fruit(3L, "Kiwi", "New Zealand"));

Comparator<Option> byNameComparator = (e1, e2) -> e1.getName().compareToIgnoreCase(e2.getName());

fruits = fruits.stream().filter(fruit -> "India".equals(fruit.getCountry()))
            .sorted(byNameComparator).collect(Collectors.toList());

List<Fruit> fruitsWithPluralNames = Lists.newArrayList();
for (Fruit fruit : fruits) {
    fruit.setName(fruit.getName() + "s");
    fruitsWithPluralNames.add(fruit);
}

System.out.println(fruitsWithPluralNames);

// which prints [Fruit(id=1, name=Apples, country=India), Fruit(id=2, name=Pineapples, country=India), Fruit(id=3, name=Kiwis, country=New Zealand)]

Avons-nous un moyen d'obtenir le même comportement en utilisant des flux Java8?

20
Bhavesh Dangi

Si vous voulez créer une nouvelle liste, utilisez la méthode Stream.map:

List<Fruit> newList = fruits.stream()
    .map(f -> new Fruit(f.getId(), f.getName() + "s", f.getCountry())
    .collect(Collectors.toList())

Si vous voulez modifier la liste actuelle, utilisez Collection.forEach:

fruits.forEach(f -> f.setName(f.getName() + "s"))
44
Sergey Lagutin

Vous pouvez simplement utiliser forEach. Pas de flux du tout:

fruits.forEach(fruit -> fruit.setName(fruit.getName() + "s"));
15
Apostolos

Vous pouvez utiliser peek pour le faire.

List<Fruit> newList = fruits.stream()
    .peek(f -> f.setName(f.getName() + "s"))
    .collect(Collectors.toList());
7
Sriram

juste pour modifier certaines propriétés d'une collection d'objets, vous pouvez directement utiliser forEach avec une collection comme suit

collection.forEach(c -> c.setXyz(c.getXyz + "a"))
1
Pravin

Vous pouvez le faire en utilisant la fonction de mappage de flux comme ci-dessous, pour obtenir le résultat dans un nouveau flux pour un traitement ultérieur.

Stream<Fruit> newFruits = fruits.stream().map(fruit -> {fruit.name+="s"; return fruit;});
        newFruits.forEach(fruit->{
            System.out.println(fruit.name);
        });
0
Murli