读java Optional 源码
程序员文章站
2022-03-19 10:53:02
...
//该类是jdk1.8新增的类,主要是为了解决NPE问题。 //先看构造函数: private Optional() { this.value = null; } private Optional(T value) { this.value = Objects.requireNonNull(value); } //可以看到构造函数都是私有的。所以可以推测创建该对象的方法应该是静态的。 //来看创建对象的方法:(都是静态方法) //结合上面的构造方法可以看到如果传入的value为null,会抛出NPE. public static <T> Optional<T> of(T value) { return new Optional<>(value); } //可以传入NULL public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } //再看其他方法: //返回空对象 public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } //获取对象。如果未null会抛NPE. public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } //是否有value public boolean isPresent() { return value != null; } //如果有值,就消费该值 public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); } //符合当前断言则返回负责返回empty public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); } //通过Function转换当前对象 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)); } } //平行转换 和map的区别在于这里不会用optional封装,而是直接返回optional。 public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } } public T orElse(T other) { return value != null ? value : other; } //如果是null,则从Supplier函数中get public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } //如果为空抛出异常 public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }
推荐阅读
-
学以致用——Java源码——使用多态输出平面及立体几何图形的面积和体积(Project: Shape Hierarchy)
-
Java并发之ReentrantLock类源码解析
-
Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
-
微信开放平台基于网站应用授权登录源码(java)
-
Java源码___AbstractStringBuilder类(五)
-
Java源码___String类(七)
-
为ant指定编译java源码的jdk版本 JavaAntJDKSUN
-
java 1.8 动态代理源码分析
-
java8中forkjoin和optional框架使用
-
JAVA 枚举单例模式及源码分析的实例详解