在Java8中,可以通过使用Optional类来避免空指针异常,Optional类是一个可以包含null或非null值的容器对象,在进行操作时可以先检查它是否为空,避免了程序出现NullPointerException异常的情况。下面我们来详细讲解如何使用Optional类避免空指针异常。
使用Optional类
创建Optional对象
可以使用ofNullable方法创建Optional对象,这个方法可以接收一个可能为空的对象作为参数,如果参数不为空,则会创建一个包含该对象的Optional对象,否则创建一个空的Optional对象。
示例代码:
Optional<String> optional1 = Optional.ofNullable(null);
Optional<String> optional2 = Optional.ofNullable("hello");
上面的代码中,optional1是一个空的Optional对象,而optional2则包含了一个字符串"hello"。
判断Optional对象是否为空
可以使用isPresent()方法判断Optional对象是否包含非null的值,如果包含非null的值则返回true,否则返回false。
示例代码:
Optional<String> optional = Optional.ofNullable("hello");
if (optional.isPresent()) {
System.out.println("optional包含非null的值:" + optional.get());
} else {
System.out.println("optional为空");
}
上面的代码中,首先判断optional是否包含非null的值,如果包含,则输出optional包含非null的值:hello。
获取Optional对象中的值
可以使用get()方法获取Optional对象中的值,在使用该方法之前需要先判断该Optional对象是否包含非null的值,否则会抛出NoSuchElementException异常。
示例代码:
Optional<String> optional = Optional.ofNullable("hello");
if (optional.isPresent()) {
System.out.println("optional包含非null的值:" + optional.get());
} else {
System.out.println("optional为空");
}
上面的代码中,首先判断optional是否包含非null的值,如果包含,则输出optional包含非null的值:hello。
使用orElse方法获取Optional对象中的值
可以使用orElse(T other)方法获取Optional对象中的值,如果Optional对象包含非null的值,则返回该值,否则返回指定的默认值other。
示例代码:
Optional<String> optional1 = Optional.ofNullable(null);
Optional<String> optional2 = Optional.ofNullable("hello");
String value1 = optional1.orElse("没有值");
String value2 = optional2.orElse("没有值");
System.out.println("value1的值:" + value1);
System.out.println("value2的值:" + value2);
上面的代码中,如果optional1和optional2中包含非null的值,则分别输出它们的值:没有值和hello;否则输出它们的默认值:没有值。
使用map方法操作Optional对象
可以使用map方法操作Optional对象中的值,因为map方法返回的是一个新的Optional对象,所以不会对原有的Optional对象产生影响,同时可以避免对空指针的操作。
示例代码:
Optional<String> optional = Optional.ofNullable("hello");
Optional<String> transformed = optional.map(String::toUpperCase);
System.out.println("optional对象中的值:" + optional.get());
System.out.println("transformed对象中的值:" + transformed.get());
上面的代码中,首先将optional对象中的值转换为大写形式,并将结果赋值给transformed对象,然后分别输出optional对象中的值和transformed对象中的值。
使用flatMap方法操作Optional对象
与map方法类似,flatMap方法也是一个可以操作Optional对象中的值的方法,但是flatMap方法的返回值必须是一个Optional对象。
示例代码:
Optional<String> optional = Optional.ofNullable("hello");
Optional<String> transformed = optional.flatMap(value -> Optional.of(value.toUpperCase()));
System.out.println("optional对象中的值:" + optional.get());
System.out.println("transformed对象中的值:" + transformed.get());
上面的代码中,首先将optional对象中的值转换为大写形式,并将结果赋值给transformed对象,然后分别输出optional对象中的值和transformed对象中的值。
示例说明
接下来我们通过两个示例来说明如何使用Optional类来避免空指针异常的情况。
示例一
假设我们有一个User类,该类包含了一个属性email,该属性的值可能为空。我们现在需要获取email的长度,但是在获取之前需要判断email是否为空,否则会出现空指针异常。
public class User {
private String email;
// 省略getter和setter方法
}
public class Test {
public static void main(String[] args) {
User user = new User();
user.setEmail("test@example.com");
// 传统方式
String email = user.getEmail();
if (email != null) {
int length = email.length();
System.out.println("email的长度为:" + length);
} else {
System.out.println("email为空");
}
// 使用Optional类
Optional<User> optional = Optional.ofNullable(user);
optional.map(User::getEmail)
.ifPresent(email -> {
int length = email.length();
System.out.println("email的长度为:" + length);
});
}
}
上面的代码中,首先定义了一个User类和一个Test类,其中User类包含了一个email属性,该属性可能为空。然后在Test类中,我们通过传统方式和使用Optional类的方式来获取email的长度,传统方式需要进行判断,而使用Optional类则更加简洁明了。
示例二
假设我们有一个Department类,该类包含了一个属性leader,该属性的值可能为空。我们现在需要获取leader的名称,但是在获取之前需要判断leader是否为空,否则会出现空指针异常。
public class Department {
private Person leader;
// 省略getter和setter方法
}
public class Person {
private String name;
// 省略getter和setter方法
}
public class Test {
public static void main(String[] args) {
Department department = new Department();
Person leader = new Person();
leader.setName("张三");
department.setLeader(leader);
// 传统方式
String leaderName = null;
if (department != null) {
Person person = department.getLeader();
if (person != null) {
leaderName = person.getName();
}
}
System.out.println("leader的名称为:" + leaderName);
// 使用Optional类
Optional<Department> optional = Optional.ofNullable(department);
optional.flatMap(dept -> Optional.ofNullable(dept.getLeader()))
.map(Person::getName)
.ifPresent(name -> System.out.println("leader的名称为:" + name));
}
}
上面的代码中,首先定义了一个Department类、一个Person类和一个Test类,其中Department类包含了一个leader属性,该属性可能为空;而Person类包含了一个name属性。然后在Test类中,我们通过传统方式和使用Optional类的方式来获取leader的名称,传统方式需要进行多重判断,而使用Optional类则可以通过链式操作来实现。
总的来说,使用Optional类可以避免空指针异常的情况,同时也可以让代码更加清晰明了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Java8中如何避开空指针异常 - Python技术站