public final class Optional<T> {
//Null指针的封装
private static final java.util.Optional<?> EMPTY = new java.util.Optional<>();
//内部包含的值对象
private final T value;
private Optional() ;
//返回EMPTY对象
public static<T> java.util.Optional<T> empty() ;
//构造函数,但是value为null,会报NPE
private Optional(T value);
//静态工厂方法,但是value为null,会报NPE
public static <T> java.util.Optional<T> of(T value);
//静态工厂方法,value可以为null
public static <T> java.util.Optional<T> ofNullable(T value) ;
//获取value,但是value为null,会报NoSuchElementException
public T get() ;
//返回value是否为null
public boolean isPresent();
//如果value不为null,则执行consumer式的函数,为null不做事
public void ifPresent(Consumer<? super T> consumer) ;
//过滤,如果value不为null,则根据条件过滤,为null不做事
public java.util.Optional<T> filter(Predicate<? super T> predicate) ;
//转换,在其外面封装Optional,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper);
//转换,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) ;
//value为null时,默认提供other值
public T orElse(T other);
//value为null时,默认提供other值
public T orElseGet(Supplier<? extends T> other);
//value为null时,默认提供other值
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) ;
}
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
使用方法1、
HashMap<String, String> map = new HashMap<>();
map.put("1",null);
map.put("2","99");
String s1 = map.get("1");
System.out.println(s1);
String s = Optional.ofNullable(map.get("1")).orElse("如果是null会输出这个值");
String s2= Optional.ofNullable(map.get("2")).orElse("如果是null会输出这个值");
System.out.println(s);
System.out.println(s2);
使用方法二、
JSONArray contInfo = Optional.of(respObj) .map(s->s.getJSONObject("data")) .map(s->s.getJSONObject("ContInfos")) .map(s->s.getJSONArray("ContInfo")) .orElseGet(JSONArray::new);
使用方法三、
public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); }
使用方法四、
public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp)
.map(Competition::getResult) // 相当于c -> c.getResult(),下同
.map(CompResult::getChampion) .map(User::getName)
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available.")); }
使用方法五、
string.ifPresent(System.out::println);
使用六、
因此,你应该明确对象不为 null 的时候使用 of()。
如果对象即可能是 null 也可能是非 null,你就应该使用 ofNullable() 方法:
Optional<User> opt = Optional.ofNullable(user);
使用7、
@Test public void givenPresentValue_whenCompare_thenOk() { User user = new User("john@gmail.com", "1234"); logger.info("Using orElse"); User result = Optional.ofNullable(user).orElse(createNewUser()); logger.info("Using orElseGet"); User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser()); }
这次的输出:
Using orElse Creating New User Using orElseGet
这个示例中,两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。
在执行较密集的调用时,比如调用 Web 服务或数据查询,这个差异会对性能产生重大影响。
使用8、
过滤值
除了转换值之外,Optional 类也提供了按条件“过滤”值的方法。
filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
来看一个根据基本的电子邮箱验证来决定接受或拒绝 User(用户) 的示例:
User user = new User("anna@gmail.com", "1234"); Optional<User> result = Optional.ofNullable(user) .filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
参考文献
Java8 Optional 的正确使用方式 - 简书 (jianshu.com)
(431条消息) Optional是个好东西,你会用么?(全面深度解析)_BoCong-Deng的博客-CSDN博客_optional用法
(431条消息) 使用Optional.of、ofNullable、orElse、orElseGet遇到的坑_IccBoY的博客-CSDN博客_ofnullable