如何正确使用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
相关产品推荐
相关产品推荐

