java8——Optional类型,让代码编写更优雅

68 阅读2分钟

Optional对象是一种包装器对象,它被当作一种更安全的方式,用来替代 “T” 的引用,“T” 要么为某个对象引用,要么为null。

创建Optional的值

Optional.of(): 产生一个具有给定值的Optional。如果value为null,抛出NullPointException异常

Optional<String> optional = Optional.of("hello world");

Optional.ofNullable(): 产生一个具有给定值的Optional。如果value为null,返回空Optional

Optional<String> optional1 = Optional.ofNullable("hello world");
Optional<String> optional2 = Optional.ofNullable(null);

Optional.empty(): 产生一个空的Optional

Optional<String> optional = Optional.empty();

获取Optional的值

orElse(): 在没有值的情况下,会使用默认值,否则使用存在的值

Optional<String> optional = Optional.empty();
String ostr = optional.orElse("hello world");

输出 hello world

orElseGet(): 调用返回指定类型的代码

Optional<String> optional = Optional.empty();
String ostr = optional.orElseGet(() -> new Date().toString());

orElseThrow(): 在没有任何值的情况下抛出异常

Optional<String> optional = Optional.empty();
String ostr = optional.orElseThrow(IllegalAccessError::new);

消费Optional的值

获取Optional值时,在不存在任何值的情况下可以产生相应的替代物。消费Optional值时有一条策略是只有在其存在的情况下才消费该值

ifPresent(): 如果可选值存在,那么它会被传递给该函数。否则,就不会执行

//如果Option包装的String对象存在,则打印该字符串
Optional<String> optional = Optional.empty();
optional.ifPresent(v -> System.out.println(v));

处理Optional的值

map(): 使用map方法来转换Optional内部的值

//如果optional内部的值为空,map方法返回空
Optional<String> optional = Optional.of("hello world");
optional.map(String::toUpperCase);
//如果optional内部的值存在,将这个值添加到列表中,否则什么也不会发生
List<String> results = new ArrayList<>();
optional.map(results::add);

filter(): 在Optional包装的数据中获取满足条件的值,过滤不满足条件的值

//"hello world"长度不大于20,不满足条件,值被过滤
Optional<String> optional = Optional.of("hello world");
optional = optional.filter(s -> s.length()>20);
System.out.println(optional.orElse(""));

用flatMap构建Optional值的函数

flatMap():这个方法被用来将产生结果的两个方法组合起来,说的通俗一点就是后面的函数的参数值来自于前面的函数的返回值。

    public static void main(String[] args) {
        //调用get计算出的结果传递给get2,最后返回给result
        Optional<Double> result = get1(12.0).flatMap(test::get2);
    }
    
    public static Optional<Double> get1(Double x){
        return x == 0 ? Optional.empty() : Optional.of(x/2);
    }

    public static Optional<Double> get2(Double x){
        return x < 0 ? Optional.empty() : Optional.of(x/2);
    }

这篇文章介绍optional一些简单常用的使用方法