2016-07-21 31 views
8

Mam listę obiektów Fruit w tablicy array i chcę zmodyfikować fruitName na jej nazwę w liczbie mnogiej. Patrz na przykład:Modyfikowanie wartości właściwości obiektów na liście przy użyciu strumieni java 8

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

Czy mamy jakikolwiek sposób, aby osiągnąć takie samo zachowanie przy użyciu java8 strumienie?

+3

Jaki jest sens dodawania elementów do A Nowa lista? Ta lista jest identyczna z oryginalną listą. W przypadku pozostałych zadań nie potrzebujesz strumienia: 'fruits.forEach (fruit -> fruit.setName (fruit.getName() +" s ")). Nawiasem mówiąc, 'Lists.newArrayList()' nie ma przewagi nad 'nowym ArrayList <>()' – Holger

Odpowiedz

21

Jeśli chcesz utworzyć nową listę, należy Stream.map metoda:

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

Jeśli chcesz zmodyfikować aktualną listę, użyj Collection.forEach:

fruits.forEach(f -> f.setName(f.getName() + "s")) 
+3

bez potrzeby 'strumienia()'. można to zrobić za pomocą 'forEach()' – Apostolos

+0

@Apostolos dzięki za porady –

+0

@SergeyLagutin i @Apostolos dzięki za odpowiedź. Pętla "Collection.forEach" jest przyjemna i całkiem prosta w użyciu. Jak tylko zaktualizowałem moje pytanie (dodano filtr i posortuj listę używając strumieni). Czy łączymy wiele funkcji nazwy z filtrem i sortowaniem? lub potrzebujemy ponownie oddzielić 'Collection.forEach'? –

7

Możesz użyć tylko forEach. Nie strumień w ogóle:

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

Można to zrobić za pomocą strumieni funkcji map jak poniżej, dostać spowodować nowego strumienia do dalszego przetwarzania.

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