Java Optional实践(小结)
什么是Java Optional?
Optional
是 Java 8
引入的一个新特性,可以作为一种容器,对空值的处理提供更为优美的解决方案。
通常情况下我们在使用 Java 的时候经常会遇到 NullPointerException
,就比如一个变量为 null
,我们调用其方法时就可能会抛出该异常。而 Optional
就是解决这一问题的。它在包装对象的同时,判断其值是否为 null
,并将其包装在一个容器中。如果该值为 null
,那么程序能够更加优雅的处理这种情况。
如何使用Java Optional?
Optional的创建
Optional
的创建方式有多种,最常用的方式是使用 ofNullable()
和 of()
方法:
// 创建一个值为 null 的 Optional
Optional<String> optional1 = Optional.ofNullable(null);
// 创建一个值不为 null 的 Optional
Optional<String> optional2 = Optional.of("test");
Optional的常用方法
isPresent()
:判断 Optional 是否包含非空值。
java
Optional<String> optional = Optional.ofNullable("test");
boolean isPresent = optional.isPresent();
orElse()
:如果 Optional 包含非空值,返回该值,否则返回指定的默认值。
java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElse("默认值");
orElseGet()
:如果 Optional 包含非空值,返回该值,否则返回通过 supplier 提供的默认值。
java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseGet(() -> "通过supplier提供的默认值");
orElseThrow()
:如果 Optional 包含非空值,返回该值,否则抛出指定的异常。
java
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseThrow(IllegalArgumentException::new);
ifPresent()
:如果 Optional 包含非空值,则使用 consumer 对其进行处理。
java
Optional<String> optional = Optional.ofNullable("test");
optional.ifPresent(value -> System.out.println(value));
Optional的应用场景
使用 Optional
的主要目的是为了解决 null
带来的问题,特别是在以下情境使用 Optional
可以带来更为可读且结构较好的代码:
- 返回值为
null
的情况。
在调用一些方法的时候,返回值可能为 null
,这时候就可以使用 Optional
来包装返回值:
java
public Optional<String> getValue(int i) {
if (i == 0) {
return Optional.empty();
}
return Optional.of("test");
}
- 处理集合中的
null
值。
在遍历一个集合时可能会出现其中某个元素值为 null
,而这时候通过if (value == null)
的方式处理不够优雅。这时候可以借助 Optional
来处理:
java
List<String> list = Arrays.asList("hello", "world", null, "optional");
list.stream().filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);
示例说明
示例1:使用Optional解决空指针异常
以下是解决空指针异常的简单例子。在该例子中,Company
类中包含了一个员工对象 employee
,而该对象有可能为空。在传统的方式下我们通常需要添加一个判断,增加代码的复杂度。而通过使用 Optional
,我们可以更加简洁地处理这一情况:
public class Company {
private Employee employee;
public Optional<Employee> getEmployee() {
return Optional.ofNullable(employee);
}
}
public class Employee {
private String name;
public String getName() {
return name;
}
}
Optional<Company> companyOptional = Optional.of(new Company());
String name = companyOptional.flatMap(Company::getEmployee)
.map(Employee::getName)
.orElse("Unknow");
示例2:使用Optional处理集合中的null
以下是使用 Optional
处理集合中的 null
值的例子。在下面的例子中我们使用了 Optional
来避免了集合中的 null
值带来的 NullPointerException
:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
List<Person> persons = Arrays.asList(new Person("test1"),
new Person("test2"),
new Person(null));
persons.stream().map(optional(Person::getName)).forEach(System.out::println);
在上面的例子中,我们通过 map
方法将 Optional
应用到每个元素上,如果元素不是 null
,则将其的名字输出;否则,输出 "Unknow"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Optional实践(小结) - Python技术站