java8写一个不改变原list的条件下,将其中多个字段更新成特定值,并生成新的list的共通方法
时间: 2024-05-02 21:21:58 浏览: 66
可以使用 Java 8 的流式编程特性来实现这个需求。具体实现如下:
```java
public static <T> List<T> updateFields(List<T> list, Predicate<T> filter, Consumer<T> updater) {
return list.stream()
.map(item -> {
if (filter.test(item)) {
updater.accept(item);
}
return item;
})
.collect(Collectors.toList());
}
```
这个方法接受三个参数:
1. `list`:要进行更新的原始列表。
2. `filter`:一个 `Predicate<T>` 对象,表示要更新哪些元素。只有满足这个条件的元素才会被更新。
3. `updater`:一个 `Consumer<T>` 对象,表示如何更新元素。对于满足 `filter` 条件的元素,会调用这个对象的 `accept()` 方法进行更新。
这个方法的原理是,使用流式编程对原列表进行遍历和转换。遍历时,对于每个元素先进行 `filter` 的条件判断,如果满足条件,则调用 `updater` 对象进行更新。最后将转换后的元素收集到新的列表中并返回。
这个方法不会改变原列表中的元素,而是生成一个新的列表。使用时可以这样调用:
```java
List<Student> students = Arrays.asList(
new Student("Tom", 18, "male"),
new Student("Alice", 20, "female"),
new Student("Bob", 19, "male")
);
List<Student> newStudents = updateFields(students,
student -> student.getAge() > 18,
student -> {
student.setGender("unknown");
student.setAge(0);
});
System.out.println(students);
System.out.println(newStudents);
```
这个例子表示将年龄大于 18 岁的学生的性别和年龄都更新为 "unknown" 和 0,生成一个新的列表。原列表和新列表分别输出如下:
```
[Student{name='Tom', age=18, gender='male'}, Student{name='Alice', age=20, gender='female'}, Student{name='Bob', age=19, gender='male'}]
[Student{name='Tom', age=18, gender='male'}, Student{name='Alice', age=0, gender='unknown'}, Student{name='Bob', age=0, gender='unknown'}]
```
可以看到,原列表中的元素没有改变,而新列表中的元素被正确地更新了。
阅读全文