You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用Java Stream的map操作实现人员年龄批量增加

如何用Java Stream实现List中所有人员年龄增加10岁

问题分析

你的代码执行失败的核心原因是:map操作要求对每个元素执行转换后返回对应类型的对象,但person.setAge()是返回void的方法,导致类型不匹配,无法通过编译。

正确实现方式

方式一:允许修改原对象(使用forEach)

如果可以接受修改原列表中的Person对象,不需要生成新集合,直接用forEach遍历修改属性即可:

// 直接修改原列表中的对象
people.stream().forEach(person -> person.setAge(person.getAge() + 10));

// 遍历原列表输出结果
people.forEach(person -> 
    System.out.printf("%s: %d\n", person.getName(), person.getAge())
);

方式二:遵循Stream无副作用原则(创建新对象)

Stream设计的最佳实践是避免副作用(即不修改原对象),此时可以通过map创建新的Person实例,保留原对象的其他属性,仅修改年龄:

List<Person> persons = people.stream()
    .map(person -> new Person(person.getName(), person.getAge() + 10, person.getGender()))
    .collect(Collectors.toList());

// 遍历新列表输出结果
persons.forEach(person -> 
    System.out.printf("%s: %d\n", person.getName(), person.getAge())
);

附:原代码参考

Person.java

public class Person {

    // Fields
    private String name;
    private int age;
    private String gender;

    // Constructor
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // Getters
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
    public String getGender() {
        return this.gender;
    }

    // Setters
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }

}

原错误的Streams.java代码片段

// 错误代码:map中使用返回void的setAge方法
List <Person> persons = people.stream()
    .map(person -> person.setAge(person.getAge() + 10))
    .collect(Collectors.toList());

内容的提问来源于stack exchange,提问作者DDStackoverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:01:21