Optional是在Java8中提供的一个容器对象。其提供了一个Optional.empty容器来代替一些方法的返回值的null,并且也让api一看就知道返回值的对象要去判断容器中是否存在值。并且Optional类中包含了一些方法来处理值是否存在的状况,比如调用之后如果是空的可以返回一个统一的处理或者抛出一个统一捕获的异常。
首先来看一些方法的解释:
- of方法。of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。 - ofNullable方法,为指定的值创建一个Optional 如果指定的值为null,则返回一个空的Optional - isPresent方法 Optional对象中存在返回true 不存在返回false - get方法 如果Optional有值则返回,否则抛出NoSuchElementException - ifPresent方法 如果Optional实例有值则为其调用Consumer,否则不做处理 Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,没有返回值。 - orElse方法 如果有值将其返回,否则返回其他的指定值 - orElseGet方法 与OrElse方法相似,不同在于默认值的处理。OrElse方法将传入的字符串作为默认值 orElseGet方法则可以接受Supplier接口的实现来生成默认值 可以接受一个lambda的来作为默认值 - orElseThrow方法 如果有值则将其返回,否则抛出supplier接口创建的异常 - map方法 如果有值,则对其执行mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map的返回值,否则返回空的Optional - flatMap方法,与map方法类似。不同点在于 flatMap方法中的mapping方法返回值必须是Optional类型的 而map方法中mapping方法返回值可以是任意类型 - filter方法 如果有值并且满足断言条件返回包含该值得Optional,否则返回空Optional
每个方法在下面的例子中都会应用
package optional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* Java8中的optional使用
* 这是一个可以为null的容器对象。如果值存在则isPresent方法返回true,调用get()方法会返回该对象
*
* @author 夸克
* @create 2018/7/10 14:26
*/
public class OptionalTest {
public static void main(String[] args) {
/**
* 1.of方法,为非null的值创建一个Optional of方法通过工厂方法创建Optional类,需要注意传入参数不能为null
* 否则会抛出NullPointerException
*/
Optional<String> name = Optional.of("abce");
System.out.println(name.get());
// Optional<String> nullString = Optional.of(null); // 这里会抛出空指针异常
/**
* 2.ofNullable方法,为指定的值创建一个Optional 如果指定的值为null,则返回一个空的Optional
*/
Optional<String> empty = Optional.ofNullable(null);
System.out.println(Optional.empty().equals(empty));// 返回true
/**
* 3.isPresent方法 Optional对象中存在返回true 不存在返回false
*/
boolean present = empty.isPresent();// false
boolean present1 = name.isPresent();// true
/**
* 4.get方法 如果Optional有值则返回,否则抛出NoSuchElementException
*/
name.get();
// empty.get();// 会抛出noSuchElementException
/**
* 5.ifPresent方法 如果Optional实例有值则为其调用Consumer,否则不做处理
* Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,没有返回值。
*/
name.ifPresent((s) -> { // s为optional容器实例中的对象
System.out.println(s);
});
/**
* 6.orElse方法 如果有值将其返回,否则返回其他的指定值
*/
System.out.println(name.orElse("this is no value")); // 打印容器中的字符串对象
System.out.println(empty.orElse("this is no value"));// 打印this is no value
/**
* 7.orElseGet方法 与OrElse方法相似,不同在于默认值的处理。OrElse方法将传入的字符串作为默认值
* orElseGet方法则可以接受Supplier接口的实现来生成默认值 可以接受一个lambda的来作为默认值
*/
System.out.println(empty.orElseGet(() -> "default value"));// 传入lambda表达式初始化默认值
/**
* 8.orElseThrow 如果有值则将其返回,否则抛出supplier接口创建的异常
*/
try {
empty.orElseThrow(() -> new OperationException());
} catch (Throwable e) {
System.out.println(e.getMessage());
}
/**
* 9.map方法 如果有值,则对其执行mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的
* Optional作为map的返回值,否则返回空的Optional
*/
Optional<String> chars = empty.map((s) -> s.toUpperCase());
System.out.println(chars.orElse("this is no value"));
/**
* 10.flatMap方法,与map方法类似。不同点在于 flatMap方法中的mapping方法返回值必须是Optional类型的
* 而map方法中mapping方法返回值可以是任意类型
*/
Optional<String> flatMap = name.flatMap((s) -> Optional.of(s.toUpperCase()));
System.out.println(flatMap.orElse("this is no value"));
/**
* 11.filter方法 如果有值并且满足断言条件返回包含该值得Optional,否则返回空Optional
*/
Optional<String> filter1 = Optional.of("string");
Optional<String> optionalS = filter1.filter(e -> e.length() > 3);
System.out.println(optionalS.orElseGet(() -> "this is no value"));
Optional<String> optionalS1 = filter1.filter(e -> e.length() > 6);
System.out.println(optionalS1.orElseGet(() -> "this is no value"));
}
}
代码详见:
https://github.com/zhanglijun1217/java8