欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Optional类说明及使用(JDK8)

程序员文章站 2022-03-04 11:34:11
...

Optional类是JDK8提供的类,用于防止出现空指针异常。本篇旨在对该类进行说明及具体使用方式列举。

一、序言

Option在使用中主要是为了简化传统Java的if else形式对null情况进行判断。既然为了简化代码编写,就必须要提到JDK8的Lambda表达式。Lambda表达式是建立在函数式接口(函数式接口由@FunctionalInterface注解标识,接口有且仅有一个抽象方法)上的,具有()->{}的形式的函数表达式,有点类似于JavaScript中ES6的箭头函数形式。其使用场景举例如下:

//遍历Map集合
public static void main(String[] args) {
    Map<String, String> hashMap = new HashMap<>();
    hashMap.put("First", "111");
    hashMap.put("Second", "222");

    // 使用增强for的方式来遍历hashMap
    for (Map.Entry<String, String> entry : hashMap.entrySet()) {
        System.out.println(entry.getKey()+":"+entry.getValue());
    }

    // 使用Lambda表达式的方式来遍历hashMap
    hashMap.forEach((s, s2) -> System.out.println(s + ":" + s2));
}

即通过简洁的函数体形式减少了代码量。

二、Optional类

2.1 构造方式

Optional类方法结构图如下:

Java Optional类说明及使用(JDK8)

类方法中构建Optional容器的方式有ofNullable、of两种:

    // 创建出Optional容器,并将对象(value)装载到Optional容器中。
    // 传入的value如果为null,抛出异常(调用的是Optional(T value)方法)
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    // 创建出Optional容器,并将对象(value)装载到Optional容器中。
    // 传入的value可以为null,如果为null,返回一个没有装载对象的Optional对象
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

其中:

  • 调用ofNullable()方法,传入的对象可以为null

  • 调用of()方法,传入的对象不可以为null,否则抛出NullPointerException

2.2 简单使用

Optional常用的方法如下:

// 得到容器中的对象,如果为null就抛出异常
public T get() {
    if (value == null) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

// 判断容器中的对象是否为null
public boolean isPresent() {
    return value != null;
}

// 如果容器中的对象存在,则返回。否则返回传递进来的参数
public T orElse(T other) {
    return value != null ? value : other;
}

测试用法示例如下:

public static void main(String[] args) {

        User user = new User();//类定义省略,包含name和id
        User user1 = null;

        Optional<User> op1 = Optional.ofNullable(user);
        System.out.println(op1.isPresent());//true
        System.out.println(op1.get());//User<name=null,id=null>
        System.out.println(op1.orElse(user1));//User<name=null,id=null>

        Optional<User> op1 = Optional.ofNullable(user1);
        System.out.println(op1.isPresent());//false
        System.out.println(op1.orElse(user));//User<name=null,id=null>
        System.out.println(op1.get());//抛出异常

}

对于一般情况而言,使用Optional判断方式常见为以下代码:

public String present(User user){
    Optional<User> optional=Optional.ofNullable(User);
    if(optional.isPresent){
        return optional.get().getName();
    }else{
        return "Unknown";
    }
}

 但其实相比于传统的null判断方式代码量并未减少,由此引出下一节:ifPresent

三、ifPresent

3.1 简单用法

ifPresent简单用法如下:

public static void main(String[] args) {

    User user = new User();
    user.setName("Tom");
    test(user);
}

public static void test(User user) {

    Optional<User> optional = Optional.ofNullable(user);

    // 如果存在user,则打印user的name
    optional.ifPresent((value) -> System.out.println(value.getName()));

    // 旧写法
    if (user != null) {
        System.out.println(user.getName());
    }
}

3.2 filter

借助filter可以对Optional进行条件过滤 :

public static void test(User user) {

    Optional<User> optional = Optional.ofNullable(user);

    // 如果容器中的对象存在,并且符合过滤条件,返回装载对象的Optional容器,否则返回一个空的Optional容器
    optional.filter((value) -> "Tom".equals(value.getName()));
}

 3.3 map

public static void test(User user) {

    Optional<User> optional = Optional.ofNullable(user);

    // 如果容器的对象存在,则对其执行调用mapping函数得到返回值。然后创建包含mapping返回值的Optional,否则返回空Optional。
    optional.map(user1 -> user1.getName()).orElse("Unknown");
}

// 上面一句代码对应着最开始的老写法:

public String tradition(User user) {
    if (user != null) {
        return user.getName();
    }else{
        return "Unknown";
    }
}

 

 

相关标签: Java后端 java