Java8新特性之——Optional

Optional是在Java8中提供的一个容器对象。其提供了一个Optional.empty容器来代替一些方法的返回值的null,并且也让api一看就知道返回值的对象要去判断容器中是否存在值。并且Optional类中包含了一些方法来处理值是否存在的状况,比如调用之后如果是空的可以返回一个统一的处理或者抛出一个统一捕获的异常。

首先来看一些方法的解释:

- of方法。of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
- ofNullable方法,为指定的值创建一个Optional 如果指定的值为null,则返回一个空的Optional
- isPresent方法 Optional对象中存在返回true 不存在返回false
- get方法 如果Optional有值则返回,否则抛出NoSuchElementException
- ifPresent方法 如果Optional实例有值则为其调用Consumer,否则不做处理
 Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,没有返回值。
- orElse方法 如果有值将其返回,否则返回其他的指定值
- orElseGet方法 与OrElse方法相似,不同在于默认值的处理。OrElse方法将传入的字符串作为默认值 orElseGet方法则可以接受Supplier接口的实现来生成默认值 可以接受一个lambda的来作为默认值
- orElseThrow方法 如果有值则将其返回,否则抛出supplier接口创建的异常
- map方法 如果有值,则对其执行mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map的返回值,否则返回空的Optional
- flatMap方法,与map方法类似。不同点在于 flatMap方法中的mapping方法返回值必须是Optional类型的 而map方法中mapping方法返回值可以是任意类型
- filter方法 如果有值并且满足断言条件返回包含该值得Optional,否则返回空Optional


每个方法在下面的例子中都会应用

package optional;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Java8中的optional使用
 * 这是一个可以为null的容器对象。如果值存在则isPresent方法返回true,调用get()方法会返回该对象
 *
 * @author 夸克
 * @create 2018/7/10 14:26
 */
public class OptionalTest {

    public static void main(String[] args) {

        /**
         * 1.of方法,为非null的值创建一个Optional of方法通过工厂方法创建Optional类,需要注意传入参数不能为null
         * 否则会抛出NullPointerException
         */
        Optional<String> name = Optional.of("abce");
        System.out.println(name.get());

//        Optional<String> nullString = Optional.of(null); // 这里会抛出空指针异常

        /**
         * 2.ofNullable方法,为指定的值创建一个Optional 如果指定的值为null,则返回一个空的Optional
         */
        Optional<String> empty = Optional.ofNullable(null);
        System.out.println(Optional.empty().equals(empty));// 返回true


        /**
         * 3.isPresent方法 Optional对象中存在返回true 不存在返回false
         */
        boolean present = empty.isPresent();// false
        boolean present1 = name.isPresent();// true

        /**
         * 4.get方法 如果Optional有值则返回,否则抛出NoSuchElementException
         */
        name.get();
//        empty.get();// 会抛出noSuchElementException

        /**
         * 5.ifPresent方法 如果Optional实例有值则为其调用Consumer,否则不做处理
         * Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,没有返回值。
         */
        name.ifPresent((s) -> { // s为optional容器实例中的对象
            System.out.println(s);
        });

        /**
         * 6.orElse方法 如果有值将其返回,否则返回其他的指定值
         */
        System.out.println(name.orElse("this is no value")); // 打印容器中的字符串对象
        System.out.println(empty.orElse("this is no value"));// 打印this is no value

        /**
         * 7.orElseGet方法 与OrElse方法相似,不同在于默认值的处理。OrElse方法将传入的字符串作为默认值
         * orElseGet方法则可以接受Supplier接口的实现来生成默认值 可以接受一个lambda的来作为默认值
         */

        System.out.println(empty.orElseGet(() -> "default value"));// 传入lambda表达式初始化默认值

        /**
         * 8.orElseThrow 如果有值则将其返回,否则抛出supplier接口创建的异常
         */
        try {
            empty.orElseThrow(() -> new OperationException());
        } catch (Throwable e) {
            System.out.println(e.getMessage());
        }

        /**
         * 9.map方法 如果有值,则对其执行mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的
         * Optional作为map的返回值,否则返回空的Optional
         */
        Optional<String> chars = empty.map((s) -> s.toUpperCase());
        System.out.println(chars.orElse("this is no value"));

        /**
         * 10.flatMap方法,与map方法类似。不同点在于 flatMap方法中的mapping方法返回值必须是Optional类型的
         * 而map方法中mapping方法返回值可以是任意类型
         */
        Optional<String> flatMap = name.flatMap((s) -> Optional.of(s.toUpperCase()));
        System.out.println(flatMap.orElse("this is no value"));

        /**
         * 11.filter方法 如果有值并且满足断言条件返回包含该值得Optional,否则返回空Optional
         */
        Optional<String> filter1 = Optional.of("string");
        Optional<String> optionalS = filter1.filter(e -> e.length() > 3);
        System.out.println(optionalS.orElseGet(() -> "this is no value"));

        Optional<String> optionalS1 = filter1.filter(e -> e.length() > 6);
        System.out.println(optionalS1.orElseGet(() -> "this is no value"));

    }

}

代码详见:

https://github.com/zhanglijun1217/java8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值