Optional类(JDK8)

java8引入新类Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException)

本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。

Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此    

主要方法介绍:

构造方法:

private Optional();//返回一个含null的Optional实例
private Optional(T value);//返回一个非null的Optional实例,如果传入null,抛出空指针异常

普通方法 :

1. 静态方法 empyt(),返回一个空的Optional实例。

public static<T> Optional<T> empty();

2. 静态方法 of(T value),返回具有 Optional的当前非空值的Optional。如果value是null就抛出空指针异常

public static <T> Optional<T> of(T value);

3. 静态方法 ofNullable(T value),返回一个指定值的Optional实例,如果参数为null,则返回一个空的 Optional实例

public static <T> Optional<T> ofNullable(T value);

4. get(),如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException 

public T get();

5. isPresent(),如果存在值,则返回 true ,否则为 false 

public boolean isPresent();

6. ifPresent(Consumer<? super T> consumer),如果存在值,则使用该值调用指定的消费者,否则不执行任何操作

public void ifPresent(Consumer<? super T> consumer){
    if (value != null)
            consumer.accept(value);
}
//eg:
opt.ifPresent( u -> assertEquals(user.getEmail(), u.getEmail()));
//这个例子中,只有 user 用户不为 null 的时候才会执行断言。

7. orElse(T other),返回值如果存在,否则返回 other(默认值)

public T orElse(T other);

8. orElseGet(Supplier<? extends T> other),返回值(如果存在),否则调用 other并返回该调用的结果。

public T orElseGet(Supplier<? extends T> other){
    return value != null ? value : other.get();
}

9. orElseThrow(Supplier<? extends X> exceptionSupplier);返回包含的值(如果存在),否则抛出由提供的供应商创建的异常。 

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }

10. map(Function<? super T, ? extends U> mapper);//如果存在值,则应用提供的映射函数,如果结果不为空,则返回一个Optional结果的Optional 。 否则返回一个空的Optional 。

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));
        }
    }

11. filter(Predicate<? super T> predicate);//如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional 。

public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }

12. flatMap(Function<? super T, Optional<U>> mapper);//如果一个值存在,应用提供的Optional映射函数给它,返回该结果,否则返回一个空的Optional 。 这种方法类似于map(Function) ,但是提供的映射器是一个结果已经是Optional映射器,如果被调用, flatMap不会用额外的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 class OptionalTest {
    public static void main(String[] args) {
        //private static final Optional<?> EMPTY = new Optional<>();
        //private final T value;
        //private Optional() { this.value = null;}
        //private Optional(T value) { this.value = Objects.requireNonNull(value);}

        //1.public static<T> Optional<T> empty() 生成一个value为null的Optional
        /*public static<T> Optional<T> empty() {
            Optional<T> t = (Optional<T>) EMPTY;
            return t;
        }*/
        Optional<String> empty = Optional.empty();

        //2.public static <T > Optional < T > of(T value) 生成一个指定value的Optional
        /*public static <T > Optional < T > of(T value) {
            return new Optional<>(value);
        }*/
        Optional<String> optional = Optional.of("optional");

        //3.public static <T> Optional<T> ofNullable(T value) 根据参数判断生成value是不是null的Oprional
        /* public static <T> Optional<T> ofNullable(T value) {
            return value == null ? empty() : of(value);
         }*/
        Optional<String> optional1 = Optional.ofNullable("张三");

        //4.public T get()//获取value值,如果是null抛出异常
        /* public T get() {
            if (value == null) {
                throw new NoSuchElementException("No value present");
            }
            return value;
         }*/
        //String s = empty.get();
        String s1 = optional.get();

        //5.isPresent() 判断value是不是为null
        /*public boolean isPresent() {
            return value != null;
        }*/
        boolean present = empty.isPresent();
        boolean present1 = optional.isPresent();

        //6.ifPresent(Consumer<? super T> consumer) 如果value不为null执行lambda
        /*public void ifPresent(Consumer<? super T> consumer) {
            if (value != null)
                consumer.accept(value);
        }*/
        Optional<String> opt = Optional.of("123456");
        opt.ifPresent(name -> System.out.println(name.length()));

        //7.filter(Predicate<? super T> predicate) 用于过滤。接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象
        /*public Optional<T> filter(Predicate<? super T> predicate) {
            Objects.requireNonNull(predicate);
            if (!isPresent())
                return this;
            else
                return predicate.test(value) ? this : empty();
        }*/
        Integer year = 2016;
        Optional<Integer> yearOptional = Optional.of(year);
        boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();
        System.out.println(is2016);
        boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();
        System.out.println(is2017);

        //8.map(Function<? super T, ? extends U> mapper) 将一个值转换成另一个值,下面的例子是返回字符串的长度,没有则返回默认值0
        /*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));
            }
        }*/
        String name = "james";
        Optional<String> nameOptional = Optional.of(name);
        int len = nameOptional.map(String::length).orElse(0);

        //9.public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)将一个值转换成另一个值,如果为null,抛出异常
        /*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));
            }
        }*/
        String name2 = "bob";
        Optional<String> name21 = Optional.of(name2);
        name21.flatMap((n) -> null);

        //10.public T orElse(T other) 如果optional不为null就返回value, 否则返回other
        /*public T orElse(T other) {
            return value != null ? value : other;
        }*/
        Person person2 = new Person();
        person2.setName("Tom");
        person2.setAge(18);
        Optional<Person> userOptional = Optional.ofNullable(person2);
        Person person3 = userOptional.orElse(new Person() {{
            setAge(17);
            setName("Jack");
        }});

        //11.public T orElseGet(Supplier<? extends T> other) 如果vaue不为null返回value,否则返回Supplier get()
        /*public T orElseGet(Supplier<? extends T> other) {
            return value != null ? value : other.get();
        }*/
        Person person4 = new Person();
        person4.setName("jack");
        Optional<Object> empty1 = Optional.empty();
        String name3 = String.valueOf(empty1.orElseGet(person4::getName));

        //12.orElseThrow 返回Optional包裹的值,如果值为null,则抛出异常
        /*public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
            if (value != null) {
                return value;
            } else {
                throw exceptionSupplier.get();
            }
        }*/
        Optional<String> str = Optional.empty();
        try {
            str.orElseThrow(Exception::new);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //连环null检查
        method1();
    }

    public static String method1() {
        Person person = new Person("Tom");
        Optional<Person> person2 = Optional.ofNullable(person);
        person2.map(p -> p.getName()).map(p -> p.toLowerCase()).orElse(null);

        if (person != null) {
            String name4 = person.getName();
            if (name4 != null) {
                return name4.toLowerCase();
            } else {
                return null;
            }
        } else {
            return null;
        }
    }
}

转载:https://www.cnblogs.com/zhangboyu/p/7580262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值