java
主页 > 软件编程 > java >

Java中怎么优雅地处理null值

2025-04-16 | 佚名 | 点击:

假设我们有一个学生对象,以及这个学生对象的 Optional 包装器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class Student {

    private String name;

    private Integer age;

 

    // 全参构造函数

    public Student(String name, Integer age) {

        this.name = name;

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public Integer getAge() {

        return age;

    }

    // toString 方法

    @Override

    public String toString() {

        return"Student{" + "name='" + name + '\'' + ", age=" + age + '}';

    }

}

1

2

3

4

5

6

public class OptionalTest {

    public static void main(String[] args) {

        Student student = new Student("Bob", 18);

        Optional<Student> studentOpt = Optional.ofNullable(student);

    }

}

如果不与 Lambda 结合使用,Optional 并不能简化原本繁琐的 null 值检查。例如:

1

2

3

4

5

6

7

8

9

10

11

12

// 编写方法 1

if (student == null) {

    return UNKNOWN_STUDENT;

} else {

    return student;

}

// 编写方法 2

if (!studentOpt.isPresent()) {

    return UNKNOWN_STUDENT;

} else {

    return studentOpt.get();

}

只有将 Optional 与 Lambda 结合使用,才能发挥它真正的威力!

现在,让我们对比一下 Java 8 中 Lambda + Optional 与传统 Java 在以下四种常见 null 处理场景中的差异。

场景 1:不为 null 则执行

1

2

3

4

5

6

// if 语句

if (student!= null) {

    System.out.println(student);

}

// Optional

studentOpt.ifPresent(System.out::println);

场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常

1

2

3

4

5

6

7

8

9

// if 语句

if (student == null) {

    return UNKNOWN_STUDENT; // 或抛出异常

} else {

    return student;

}

// Optional

return studentOpt.orElse(UNKNOWN_STUDENT);

return studentOpt.orElseThrow(RuntimeException::new);

场景 3:不为 null 则返回,为 null 则由调用方法

1

2

3

4

5

6

7

8

// if 语句

if (student == null) {

    return UNKNOWN_STUDENT;

} else {

    return generateWithFunction();

}

// Optional

return studentOpt.orElseGet(() -> generateWithFunction());

场景 4:嵌套 null 检查

1

2

3

4

5

6

7

8

9

10

11

12

13

// Java 7

if (student!= null) {

    String name = student.getName();

    if (name!= null) {

        return name;

    } else {

        return null;

    }

} else {

    return null;

}

// Java 8

return studentOpt.map(Student::getName).orElse(null);

从以上四种场景可以明显看出,Optional + Lambda 让我们少写了很多 if-else 代码块。尤其是场景 4,传统的 Java 写法显得冗长且难以理解,而 Optional+Lambda 则简洁明了,清晰易懂。

总结

通过结合 Lambda 表达式和 Optional,Java 的 null 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。

原文链接:
相关文章
最新更新