Java函数-如何使用Optional对象?
Java 8中的Optional类提供了一种简单而有用的方法来处理空值。这个对象可以用于包装可能为空的值。这篇文章将介绍Optional类的基本用法以及如何在Java函数中使用它。
Optional类的简介
Optional是一个容器对象,可以用来包装可能为空的值。这个类是Java 8新增的一个类,目的是帮助开发者更好地处理空值。当一个变量可能为空时,可以将其包装在Optional对象中,而不是直接使用null。这样做的好处是,当代码出现NullPointerException异常时,可以很容易地定位到哪里出了问题。
Optional类的主要方法
Optional类有许多有用的方法,这里列举其中一些。
1. of方法:
of方法用于创建一个指定值的Optional对象。如果指定的值为null,会抛出NullPointerException异常。
例如:
Optional<String> optional = Optional.of("hello world");
2. ofNullable方法:
ofNullable方法用于创建一个指定值的Optional对象,如果指定的值为null,会返回一个空的Optional对象。
例如:
String str = null; Optional<String> optional = Optional.ofNullable(str);
3. isPresent方法:
isPresent方法用于判断封装的值是否存在。
例如:
Optional<String> optional = Optional.ofNullable("hello world");
if (optional.isPresent()) {
System.out.println("值:" + optional.get());
}
这里会输出:"值:hello world"。
4. ifPresent方法:
ifPresent方法用于在封装的值存在的情况下执行指定操作。
例如:
Optional<String> optional = Optional.ofNullable("hello world");
optional.ifPresent(System.out::println);
这里会输出:"hello world"。
5. orElse方法:
orElse方法用于在封装的值不存在的情况下返回一个指定的默认值。
例如:
Optional<String> optional = Optional.ofNullable(null);
String str = optional.orElse("默认值");
这里str的值为"默认值"。
Java函数中Optional的使用
在Java函数中使用Optional对象可以有效避免空指针异常的问题。下面举一个示例:
原代码:
public String findUsernameById(Long id) {
User user = userRepository.findOne(id);
if (user == null) {
return "";
}
return user.getUsername();
}
上面的代码中,如果用户不存在,会返回一个空字符串。但是这种做法并不好。因为返回一个空字符串可能意味着用户不存在,也可能意味着用户的用户名就是空字符串。这样就会产生歧义了。
使用Optional对象改造后的代码:
public Optional<String> findUsernameById(Long id) {
User user = userRepository.findOne(id);
if (user == null) {
return Optional.empty();
}
return Optional.of(user.getUsername());
}
这里的函数返回类型变成了Optional<String>,如果用户不存在,会返回一个空的Optional对象。如果用户存在,会返回一个包装了用户名的Optional对象。
对于调用者,现在不能直接得到用户名,而是需要手动解包Optional对象。这可以通过调用isPresent方法和get方法来实现。例如:
Optional<String> optional = findUsernameById(1L);
if (optional.isPresent()) {
String username = optional.get();
System.out.println(username);
}
在这个示例中,如果用户存在,会输出其用户名;如果用户不存在,什么也不会发生。
总结
Optional类是Java 8中一个非常实用的工具类。使用Optional对象可以避免空指针异常等问题。在编写Java函数时,如果一个返回值可能为空,可以考虑将其改为Optional的形式。这样可以使代码更为清晰明了。
