Java中的Optional类详细解读
作者:little_fat_sheep
这篇文章主要介绍了Java中的Optional类详细解读,Optional是Java中的一个类,它的作用是用于解决空指针异常的问题,它提供了一些有用的方法,可以帮助我们避免显式进行空值检测,需要的朋友可以参考下
1 前言
Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllection)。
为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口
(如:Predicate、Consumer、Function、Supplier)参数。
2 主要属性及构造方法
类定义
Optional 类位于 java.util 包中,类定义如下:
//T 为元素数据类型 public final class Optional<T>
主要属性
//空容器 private static final Optional<?> EMPTY = new Optional<>(); //value 存储容器内唯一元素 private final T value;
构造方法
//无参构造方法:this.value = null private Optional() //有参构造方法(value不允许为空):this.value = Objects.requireNonNull(value) private Optional(T value)
3 常用方法
创建容器(empty、of、ofNullable)
//创建空容器:return (Optional<T>) EMPTY public static<T> Optional<T> empty() //创建容器(value不允许为空):return new Optional<>(value) public static <T> Optional<T> of(T value) //创建容器(value允许为空):return value == null ? empty() : of(value) public static <T> Optional<T> ofNullable(T value)
容器判空(isPresent)
//判断容器是否为空:return value != null public boolean isPresent() //判断容器是否为空,若不为空,消费元素 public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); }
应用:
Optional<User> op = Optional.of(new User("张三", 20)); op.ifPresent(user -> System.out.println(user)); //op.ifPresent(System.out::println);
获取元素(get、orElse、orElseGet)
//获取容器中唯一元素:return value public T get() //获取容器唯一元素,若为空,返回指定值:return value != null ? value : other public T orElse(T other) //获取容器唯一元素,若为空,返回供应者(Supplier)提供的元素 public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
应用:
Optional<User> op = Optional.ofNullable(null); User user = op.orElseGet(() -> new User("张三", 20));
筛选元素(filter)
//过滤不符合断言(Predicate)的元素 public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }
应用:
Optional<User> op = Optional.of(new User("张三", 20)); Optional<User> op2 = op.filter(user -> user.age > 18);
映射元素(map)
//将 T 类型元素映射为 U 类型元素 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)); } }
应用:
Optional<String> op = Optional.of(new String("12345")); Optional<Integer> op2 = op.map(str -> { try { return Integer.parseInt(str); } catch (Exception e) { return -1; } });
到此这篇关于Java中的Optional类详细解读的文章就介绍到这了,更多相关Java的Optional类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!