面试题答案
一键面试import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 35));
userList.add(new User("Charlie", 40));
List<User> resultList = userList.stream()
.peek(user -> {
if (user.getAge() > 30) {
System.out.println("Logging user: " + user);
}
})
.filter(user -> user.getAge() > 30)
.peek(user -> user.name = user.name.toUpperCase())
.collect(Collectors.toList());
System.out.println("Modified user list: " + resultList);
}
}
peek方法与filter方法的协同工作以及peek方法的作用
- 第一个peek方法:
- 作用:在流处理管道的开始阶段,用于记录年龄大于30岁的用户信息。它对每个流经的元素进行操作,这里通过打印信息模拟日志记录动作。此peek方法并不改变流中元素的流向,只是对符合条件(年龄大于30岁)的元素进行额外的操作(打印)。
- filter方法:
- 作用:对经过第一个peek方法处理后的流进行过滤,只允许年龄大于30岁的用户通过,将不符合条件的元素从流中移除,从而缩小流中元素的范围,为后续处理准备一个仅包含年龄大于30岁用户的流。
- 第二个peek方法:
- 作用:在filter方法过滤后的流上进行操作,对过滤后剩下的(年龄大于30岁)用户列表进行修改,这里将用户名字全部转为大写。此peek方法直接修改了流中的元素,为最终收集到结果列表做准备。
通过这种方式,peek方法和filter方法协同工作,实现了对用户列表的筛选、记录和修改操作。