MST

星途 面试题库

面试题:Java Optional类在函数式编程中的深度应用及性能考量

在函数式编程场景下,结合Optional类实现一个复杂的业务逻辑,例如对一个列表中的对象进行一系列条件过滤、转换操作,并且每个操作步骤都可能返回空值。同时分析在这种复杂场景下,使用Optional类对性能和代码可读性的影响,以及如何优化。请详细阐述思路并编写代码示例。
26.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

思路阐述

  1. 条件过滤:使用Optional类来处理可能为空的列表元素。对于列表中的每个对象,在进行过滤和转换操作时,首先将对象包装进Optional,以确保即使对象为空,后续操作也不会抛出NullPointerException
  2. 转换操作:在Optionalmap方法中进行转换操作,map方法会在对象不为空时执行转换函数,为空时则返回空的Optional
  3. 性能影响
    • 优点Optional减少了显式的空值检查,使代码更加简洁,在一定程度上提升了可读性。并且避免了深层嵌套的if - else空值判断,代码逻辑更加清晰。
    • 缺点Optional的操作涉及到对象的包装和解包,可能会引入一些额外的性能开销,尤其是在循环中频繁使用时。
  4. 优化
    • 减少不必要包装:对于确定不为空的对象,不进行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,过滤掉空值,然后再对非空对象进行年龄过滤,并提取姓名形成新的列表。