为什么要使用Optional?
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使代码中很多繁琐、丑陋的设计变得十分优雅。
- Optional.of(T t) : 创建一个 Optional 实例
Optional<Student> optional = Optional.of(new Student(1,"小张",18,60.2));
System.out.println(optional);//Optional[Student{id=1, name='小张', age=18, score=60.2}]
System.out.println(optional.get());//Student{id=1, name='小张', age=18, score=60.2}
- Optional.empty() : 创建一个空的 Optional 实例
Optional<Student> optional = Optional.empty();
System.out.println(optional);//Optional.empty
System.out.println(optional.get());Exception in thread "main" java.util.NoSuchElementException: No value present
- Optional.ofNullable(T t) : 若 t 不为 null,创建 Optional 实例;否则创建空实例
Optional<Object> optional = Optional.ofNullable(null);
System.out.println(optional.get());Exception in thread "main" java.util.NoSuchElementException: No value present
Optional<Object> optional2 = Optional.ofNullable("张三");
System.out.println(optional2.get());//张三
- Optional.orElse (T t)如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.orElse("zhangsan"));//张三
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("李四"));//李四
- Optional.orElseGet(Supplier s) 如果调用对象包含值,返回该值,否则返回 s 获取的值,与orElse不同的是,这里返回的值是在函数中返回的,可以有更多的逻辑判断具体返回哪个值
Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.orElseGet(() -> "zhangsan"));// 张三 可以通过Supplier写各种逻辑
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElseGet(() -> "orElseGet"));//orElseGet
- orElseThrow(Supplier s) 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的异常
public class Test {
public static void main(String[] args) {
Optional<String> op = Optional.of("张三");
System.out.println(op.orElseThrow(CustomException::new)); //张三
Optional<String> op2 = Optional.empty();
System.out.println(op2.orElseThrow(CustomException::new));//Exception
}
}
class CustomException extends RuntimeException {
private static final long serialVersionUID = -4399699891687593264L;
public CustomException() {
super("业务异常");
}
public CustomException(String message) {
super(message);
}
}
- filte(Predicate p)如果值存在并且满足提供的谓词,就返回包含该Optional对象;否则返回一个空的Optional对象
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("王五"));
stringOptional = Optional.empty();
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("lisi"));
- map(Function f) 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty(),通过map将原容器中的类型映射为新容器中的类型
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));//ZHANGSAN
stringOptional = Optional.empty();
System.out.println(stringOptional.map(e -> e.toUpperCase()));//Optional.empty
- flatMap(Function mapper):与 map 类似,但要求Function 的返回值必须是Optional类型
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.flatMap(e -> Optional.of("lisi")).orElse("失败"));//list
stringOptional = Optional.empty();
System.out.println(stringOptional.flatMap(e -> Optional.empty());//Optional.empty
- isPresent():判断容器中是否包含值,
Optional<Object> ofNullable = Optional.ofNullable("小翔");
if (ofNullable.isPresent()){
System.out.println(ofNullable.get());
}