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

时间:2016-07-21 06:24:54

标签: java-8 java-stream

我在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流实现相同的行为?

5 个答案:

答案 0 :(得分:56)

如果您想创建新列表,请使用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"))

答案 1 :(得分:17)

您只能使用forEach。根本没有流:

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

答案 2 :(得分:10)

您可以使用peek来执行此操作。

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

答案 3 :(得分:2)

仅用于修改对象集合中的某些属性,您可以按如下所示直接将forEach与集合一起使用

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

答案 4 :(得分:1)

您可以使用如下所示的流映射函数来执行此操作,将结果导入新流以供进一步处理。

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