这个类是java8添加的新类,可以当做一个容器,主要来处理对象为null的情况。
可以看到这个类的源码,里面就包含了一个value值。
创建Optional对象
1.使用of()方法,返回一个Optional实例。使用这种方式传入的value值不能为空。
static <T> Optional<T> of(T value)
2.使用ofNullAble()方法,可以传入一个可能为空的value。
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
常用方法的使用
1.判断value是否为空
isPresent返回一个boolean值。判断optional里的value是否为空。
还有一个重载方法 ,没有返回值。可以直接在里面添加逻辑。
Optional.of(user).ifPresent((u1) -> {
System.out.println("执行逻辑");
});
2. 如果value为空,则设置一个代替值
1> 使用orElse方法,和orElseGet方法可以达到以上效果。需要注意的是,这两个方法的返回值是optional的value值。
// 当optional的value是空的时候会用orelse里的值代替。
Optional.ofNullable(user).orElse(null);
// 当optional的value是空的时候会用orElseGet里获得的值代替。
Optional.ofNullable(user).orElseGet(()->{
User u = new User();
u.setName("备用的user");
return u;
});
2>使用 orElseThrow方法, 如果为空,则抛出一个自定义的异常。稍微看下源码:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
我们可以这样使用:
Optional.of(user).orElseThrow(()->new RuntimeException("自定义的异常"));
3. map方法
这里的map方法和我们用到的map集合貌似没有半毛钱关系。
如下map方法的使用,map的参数是一个方法函数,方法函数会返回一个值,作为Optional的新的value。map的返回值是一个optional实例。
/**
* <U> Optional<U> map(Function<? super T, ? extends U> mapper)
* 注意map的传入的方法函数(这个函数里面是接受了一个T类型<原来opt的value类型>,返回了一个U类型,然后U类型赋给了value)。
*/
public void fun2(User user) {
// map()方法表示,返回一个value是name的optional,value可能为空。
String str = Optional.of(user).map((u1) -> u1.getName()).orElse("name是空的。。");
System.out.println(str);
}
4. filter方法
理解了map方法在理解filter方法就比较容易了。filter的参数也是一个方法函数,返回值为boolean类型。filter方法的返回值同样是一个optional实例。而filer的功能就是筛选掉
如下代码,
public void fun3(User user) {
// user 是一个name=“sen”的实例。经过过滤之后,返回一个value = null的 optional的实例。
Optional o = Optional.of(user).filter((u1) -> {
if (u1.getName().equalsIgnoreCase("sen")){
return false;
}
return true;
});
System.out.println(o);
}