面试题答案
一键面试思路阐述
- 条件过滤:使用
Optional
类来处理可能为空的列表元素。对于列表中的每个对象,在进行过滤和转换操作时,首先将对象包装进Optional
,以确保即使对象为空,后续操作也不会抛出NullPointerException
。 - 转换操作:在
Optional
的map
方法中进行转换操作,map
方法会在对象不为空时执行转换函数,为空时则返回空的Optional
。 - 性能影响:
- 优点:
Optional
减少了显式的空值检查,使代码更加简洁,在一定程度上提升了可读性。并且避免了深层嵌套的if - else
空值判断,代码逻辑更加清晰。 - 缺点:
Optional
的操作涉及到对象的包装和解包,可能会引入一些额外的性能开销,尤其是在循环中频繁使用时。
- 优点:
- 优化:
- 减少不必要包装:对于确定不为空的对象,不进行
Optional
包装。 - 批量操作优化:如果列表较大,可以考虑使用并行流操作,以利用多核CPU提升性能。
- 减少不必要包装:对于确定不为空的对象,不进行
代码示例
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class OptionalExample {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(null);
userList.add(new User("Bob", 30));
List<String> filteredNames = userList.stream()
.map(Optional::ofNullable)
.filter(Optional::isPresent)
.map(Optional::get)
.filter(user -> user.getAge() > 25)
.map(User::getName)
.collect(Collectors.toList());
System.out.println(filteredNames);
}
}
上述代码首先将列表中的每个User
对象包装进Optional
,过滤掉空值,然后再对非空对象进行年龄过滤,并提取姓名形成新的列表。