2016-07-21 23 views
8

Arrayist'te Fruit nesnesi var ve ben FruitName'i çoğul adına değiştirmek istiyorum. örneği bakınız:java 8 akışlarını kullanarak listedeki nesnelerin özellik değerini değiştirin

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

biz java8 akışları kullanarak aynı davranışı elde etmek için herhangi bir yolu var mı?

+3

yeni liste? Bu liste orijinal listeyle aynıdır. Kalan görev için bir akışa ihtiyacınız yoktur: "fruits.forEach (fruit -> fruit.setName (fruit.getName() +" s ")). Bu arada, Lists.newArrayList() ',' stream() 'gerekliliğine 'yeni ArrayList <>()' – Holger

cevap

21

, Stream.map yöntem kullanmak bir öğe ekleyebilen noktası nedir

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

'a göre bir avantajı yoktur. – Apostolos

+0

@Apostolos ile yapılabilir. Collection.forEach' döngüsü kullanmak güzel ve oldukça basittir. Sorunumu yeni güncellediğim için (filtre ekledim ve akışları kullanarak listeyi sırala). Birden çok ad işlevini filtre ve sıralama ile birleştirir miyiz? ya da sadece 'Collection.forEach' için ayrı bir yere ihtiyacımız var? –

+0

@SergeyLagutin ve @Apostolos cevabınız için teşekkür ederiz, sadece "forEach()" –

7

Sadece forEach numaralı telefonu kullanabilirsiniz. Hiçbir akış yok:

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

Aşağıdaki gibi akış haritası işlevini kullanarak yapabilirsiniz, daha fazla işlem için yeni akışla sonuç alın. Geçerli listeyi değiştirmek istiyorsan

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

, Collection.forEach kullanın: Eğer yeni bir liste oluşturmak istiyorsak

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