java8新特性之Optional

一、概述

       它是jdk1.8提供的一个容器对象,其目的之一是对null值对象做更好的判断和处理,其二是适应lambda表达式编程风格,四大函数式接口Function,Supplier,Consumer,Predicate在Optional方法中均有使用。

二、构造函数

1.空对象              Optional.empty()
2.包含value对象        Optional.of(value)
3.无法确定是否为null    Optional.ofNullable(obj)

三、方法

1.T orElse(T other) 
如果内部value不为null,返回value,否则返回other

Optional<Student> optional = StudentDao.findById(1);
Student student = optional.orElse(new Student());

2.public T orElseGet(Supplier<? extends T> other)
如果内部value不为null,返回value,否则other supplier调用返回

Student student = Optional.ofNullable(getCacheById(1)).orElseGet(() -> StudentService.findById(1))

3.public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
如果内部value不为null,返回value,否则抛出异常

Optional<Student> optional = StudentDao.findById(1);
Student student = optional.orElseThrow(() -> new RuntimeException("resource are not found!"));

4.boolean isPresent()
判断元素是否存在

Optional<Student> optional = StudentDao.findById(1);
if (optional.isPresent()) {
     // do something
}

5.public void ifPresent(Consumer<? super T> consumer)
存在消费此value,不存在不做任何事

Optional<Student> optional = StudentDao.findById(1);
optional.ifPresent(s -> System.out.println(s.getName()));

6.public Optional<T> filter(Predicate<? super T> predicate)
过滤元素,不通过,返回EMPTY

Optional<Student> optional = StudentDao.findById(1);
boolean liExisted = optional.filter(s -> s.getName().contains("li")).isPresent();

7.public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
转换为另一种类型对象

Optional<FileInputStream> fis =
        names.stream().filter(name -> !isProcessedYet(name))
                   .findFirst()
                   .map(name -> new FileInputStream(name));

四、原始类型Optional

OptionalLong 、OptionalInt 、OptionalDouble

OptionalLong.of(111).ifPresent(System.out::println);

五、注意事项

1.Optional内部维护一个静态final EMPTY对象
private static final Optional<?> EMPTY = new Optional<>();
Optional.empty()方法返回这个对象,但是不要通过比较是否等于EMPTY判断一个Optional对象是否为空,应该通过isPresent()方法。

2.这是一个基于值value的对象,使用唯一身份识别操作时(包括地址引用相等==,唯一hashcode方法,或者多线程同步调用)在Optional的实例上都可能产生不可避免的结果,应该减少此类方法的使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值