详解 JDK8 新特性之 Optional 类

详解 JDK8 新特性之 Optional 类

目标

  • 回顾以前对 null 的处理方式
  • 介绍 Optional 类
  • 掌握 Optional 的基本使用
  • 掌握 Optional 的高级使用

以前对 null 的处理方式

public class Test01 {

    public static void main(String[] args) {
        String name = null;

        if (name != null) {
            System.out.println("姓名为:" + name);
        } else {
            System.out.println("姓名不存在");
        }
    }
}

Optional 类介绍

Optional是一个没有子类的工具类,Optional 是一个可以为 null 的容器对象。它的作用主要就是为了解决避免 Null检查,防止 NullPointException。
Optional秒速

Optional类的创建方式:

Optional.of(T t):创建一个 Optional 实例
Optional.empty():创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

Optional 类的常用方法

isPresent():判断是否包含值,包含值返回true,不包含值返回false
get():如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t):如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f):如果有值对其处理,并返回处理后的 Optional,否则返回 Optional.empty()

filter(Predicate<? super T> predicate)
flatMap(Function<? super T, Optional<U>> mapper)
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

 @Override
public String toString() {
    return value != null
        ? String.format("Optional[%s]", value)
        : "Optional.empty";
}

Optional类的基本使用

public class Test02 {

    public static void main(String[] args) {
        // 1、创建Optional对象
        // of 只能传入一个具体值,不能传入 null
        Optional<String> op1 = Optional.of("凤姐");
        // Optional<String> op1 = Optional.of(null);

        // ofNullable 既可以传入具体值,也可以传入 null
        // Optional<String> op2 = Optional.ofNullable("如花");
        // Optional<Object> op2 = Optional.ofNullable(null);

        // empty 存入的是空
        Optional<Object> op3 = Optional.empty();

        // 2、isPresent 判断Optional是否有具体值,有值返回true,没有值返回false
        // boolean present = op1.isPresent();
        // System.out.println("present = " + present);

        // 3、get 获取Optional中的值,如果有值就返回值具体值,没有值就报错 NoSuchElementException
        // System.out.println(op1.get());
        // System.out.println(op3.get());

        // 一般 isPresent 和 get 配合使用
        if (op1.isPresent()) {
            System.out.println(op1.get());
        } else {
            System.out.println("没有值");
        }
    }
}

Optional的高级使用:

package optional;

import java.util.Objects;
import java.util.Optional;

public class Test03 {

    public static void main(String[] args) {
        // extracted();
        // extracted2();
        extracted3();
    }

    private static void extracted3() {
        User user = new User(null, 18);
        System.out.println(getUpperUserName1(user));
        Optional<User> op = Optional.ofNullable(user);
        System.out.println(getUpperUserName2(op));
    }

    // 定义一个方法将 user 中的用户名转成大写并返回
    // 使用Optional方式
    public static String getUpperUserName2(Optional<User> op) {
        String upperName = op.map(User::getUserName)
                .map(String::toUpperCase)
                .orElse(null);
        return upperName;
    }

    // 定义一个方法将 user 中的用户名转成大写并返回
    // 使用传统方式
    public static String getUpperUserName1(User u) {
        if (u != null) {
            String userName = u.getUserName();
            if (userName != null) {
                return userName.toUpperCase();
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    private static void extracted2() {
        Optional<String> userName = Optional.of("凤姐");
        // Optional<String> userName = Optional.empty();

        // 存在做什么
        // ifPresent 如果有值就调用参数,没有值啥都不干
        /*userName.ifPresent(s -> {
            System.out.println("有值:" + s);
        });*/

        // 存在做点什么,不存在做点什么 我的jdk8没有这个方法
        /*userName.ifPresentOrElse(s -> {
            System.out.println("有值:" + s);
        }, () -> {
            System.out.println("没有值");
        });*/
    }

    private static void extracted() {
        // Optional<String> userName = Optional.of("凤姐");
        Optional<String> userName = Optional.empty();

        // orElse 如果Optional有值,就取出这个值,如果没有值就使用参数指定的值
        String name = userName.orElse("如花吗?");
        System.out.println("name = " + name);
    }
}

class User {
    private String userName;
    private Integer age;

    public User() {
    }

    public User(String userName, Integer age) {
        this.userName = userName;
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(userName, user.userName) && Objects.equals(age, user.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userName, age);
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}

小结

Optional 是一个可以为 null 的容器对象。orElse,ifPresent,ifPresentOrElse,map等方法避免对 null 的判断,写出更优雅的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDK 8引入了一个重要的新特性,即OptionalOptional是一个容器对象,它可能包含null值,也可能包含非null值。使用Optional可以避免空指针异常的发生,并提供了一种更优雅的方式来处理可能为空的值。 Optional的主要作用是封装一个可能为null的值,并提供一些方法来处理这个值。通过使用Optional,我们可以在代码中明确地表示一个值可能为空,并在使用这个值时采取相应的处理措施。 下面是一些Optional的常见用法示例: 1. 创建一个Optional对象: ```java Optional<String> optional = Optional.of("value"); ``` 这里使用`Optional.of()`方法创建一个包含非null值的Optional对象。 2. 检查Optional对象是否包含值: ```java optional.isPresent(); // 返回true,表示Optional对象包含值 ``` 通过`isPresent()`方法可以判断Optional对象是否包含值。 3. 获取Optional对象中的值: ```java optional.get(); // 返回"value" ``` 使用`get()`方法可以获取Optional对象中的值。需要注意的是,如果Optional对象为空,调用`get()`方法会抛出NoSuchElementException异常。 4. 处理Optional对象为空的情况: ```java optional.orElse("default"); // 如果Optional对象为空,返回"default" ``` 使用`orElse()`方法可以指定当Optional对象为空时返回的默认值。 5. 使用Lambda表达式处理Optional对象: ```java optional.ifPresent(value -> System.out.println(value)); ``` `ifPresent()`方法接受一个Lambda表达式作为参数,当Optional对象包含值时,执行Lambda表达式中的逻辑。 以上是Optional的一些常见用法,使用Optional可以更加安全地处理可能为空的值,避免空指针异常的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值