Optional 是一个容器
- 创建Optional
//of 方法的值不能为空否则会抛出异常
Optional<String> optional1 = Optional.of("hello");
//返回一个Null的optional
Optional<String> empty = Optional.empty();
//ofNullable 传入null不会异常
String str = null;
Optional<String> optional2 = Optional.ofNullable(str);
- 使用Optional
public class OptionalTest01 {
public Optional<User> getUserName(String userName){
if ("admin".equals(userName)){
return Optional.of(new User(userName));
}
return Optional.empty();
}
public static void main(String[] args) {
OptionalTest01 optionalTest01 = new OptionalTest01();
Optional<User> admin = optionalTest01.getUserName("admin");
//low的方式
if (admin.isPresent()){
User user = admin.get();
System.out.println(user.getUsername());
}
//推荐的Optional的方式
admin.ifPresent((user)-> System.out.println(user.getUsername()));
//如果为null的话Value备胎方式
User aNull = admin.orElse(new User("null"));
//接受一个Supplier
User zhangsan = admin.orElseGet(() -> new User("zhangsan"));
}
}
上面介绍了两种使用的方式:第一种是不建议使用的你都使用了Java8 就使用函数式编程的方式,而且还不如让你直接做一次Null的判断呢。
orElse 跟 orElseGet 的区别就是在于参数的方式不一样
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
OrElse的使用方式,我们在开发的时候通常会返回空集合,而不是 Null ,下面的两个方法都返回一个一定不是NULL的List
//传统的方式
public List<String> getString(){
//比如你要从网络、数据库获取的数据无法判断内容是否为空
List<String> stringList = Arrays.asList("hello", "world", "welcome");
if (stringList != null){
return stringList;
}
//不存在返回空集合而不是空
return new ArrayList<>();
}
//
public List<String> getString2(){
//比如你要从网络、获取的数据无法判断内容是否为空
List<String> stringList = Arrays.asList("hello", "world", "welcome");
return Optional.ofNullable(stringList).orElse(Collections.emptyList());
}