使用 Java8流修改列表中对象的属性值

我在 ArrayList 中有一个 Fruit对象的列表,我想将 fruitName修改为它的复数名称。

举个例子:

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


我们有什么方法可以使用 Java8流来实现相同的行为吗?

230003 次浏览

你可以只使用 forEach,完全没有流:

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

您可以使用如下流映射函数来做到这一点,得到新的流的结果进行进一步的处理。

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

如果要创建新列表,请使用 Stream.map方法:

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

如果要修改当前列表,请使用 Collection.forEach:

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

您可以使用 peek来做到这一点。

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

只是为了修改对象集合中的某些属性,您可以像下面这样对每个集合直接使用 for

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

我们可以通过 map 更改属性,而无需创建新对象。 下面的方法将年龄增加2岁。它将修改您的原始列表

List<Employee> l2=list.stream().map(t->{
t.setAge(t.getAge()*2);
return t;
}
).collect(Collectors.toList());

您可以使用来自流的 map。

fruits.map(i-> {
i.setFruit();
return i;
}).collect(Collectors.toList();