Java8 - 实用Optional对象

Java8-Optional

前言

身为java程序员,大家最经常遇到的或者是最容易忽视的就是npe。

当我们在调用某个方法获取返回值时,可能会直接去get或者其他操作,这就会引起npe。所以通常我们会进行判断是否为Null的操作,只有非空的前提下才能作为参数。

在java8的新特性中,Optional类就是其一。

文档是这样介绍的

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

下面就来介绍一下Optional类中的几个方法

of → 为非null的值创建一个Optional对象

        /**
         * Optional.of
         * 通过工厂方法创建Optional实例
         */
        Optional<String> optional = Optional.of("chen");

注意

of方法中会对传入的值进行null的判断,如果为Null则直接抛异常,所以一般会在确定当前参数一定不为空的情况下才用

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

ofNullable → 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

        /**
         * Optional.ofNullable
         */
        Optional<Object> optionalO = Optional.ofNullable(null);
    
    	public static <T> Optional<T> ofNullable(T value) {
        	return value == null ? empty() : of(value);
    	}

isPresent → 如果值存在返回true,否则返回false。

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

        if (optional.isPresent()){
            System.out.println(optional.get());
        }

get → 如果当前Optional对象有值则返回,否则抛出异常

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

ifPresent → 如果Optional实例有值则为其调用consumer,否则不做处理

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

        optional.ifPresent(System.out::println);

	public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

orElse → 如果有值则将其返回,否则返回指定的其它值。

        Optional<String> optional = Optional.ofNullable(null);

        System.out.println(optional.orElse("wang"));

orElseGet →

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

        Optional<String> optional = Optional.ofNullable(null);

        System.out.println(optional.orElseGet(() -> "default valve"));

orElseThrow → 如果有值则将其返回,否则抛出supplier接口创建的异常。

        Optional<String> optional = Optional.ofNullable(null);

        System.out.println(optional.orElseThrow(NullPointerException::new));

map → 如果有值,则对其执行调用mapping函数得到返回值。

如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。

        Optional<String> optional = Optional.ofNullable(null);

        Optional<String> stringOptional = optional.map(String::toLowerCase);

        System.out.println(stringOptional.orElse("no valve found"));

flatMap → flatMap方法与map方法类似,区别在于mapping函数的返回值不同

map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。

        Optional<String> optional = Optional.ofNullable(null);

        Optional<String> stringOptional = optional.flatMap( o -> Optional.of(o.toLowerCase()));

        System.out.println(stringOptional.orElse("no valve found"));

filter → 如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

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

        Optional<String> stringOptional = optional.filter(s -> s.length() < 4);

        System.out.println(stringOptional.orElse("The str length is greater or equal to 4 chars"));

文档参考:

https://www.runoob.com/java/java8-optional-class.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值