1.1 目标


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


1.2 以前对null的处理方式


image.png

1.3 Optional类介绍


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

1.4 Optional的基本使用


Optional类的创建方式:


image.png

1.5 Optional类的常用方法:

image.png
image.png

  1. // Optional类的基本使用
  2. @Test
  3. public void test02() {
  4. // 1.创建Optional对象
  5. // of:只能传入一个具体值,不能传入null
  6. // ofNullable: 既可以传入具体值,也可以传入null
  7. // empty: 存入的是null
  8. Optional<String> op1 = Optional.of("凤姐");
  9. // Optional<String> op1 = Optional.of(null);
  10. // Optional<String> op2 = Optional.ofNullable("如花");
  11. // Optional<String> op2 = Optional.ofNullable("如花");
  12. Optional<Object> op3 = Optional.empty();
  13. // 2.isPresent: 判断Optional中是否有具体值, 有值返回true,没有值返回false
  14. // boolean present = op1.isPresent();
  15. // System.out.println("present = " + present);
  16. // 3.get: 获取Optional中的值,如果有值就返回值具体值,没有值就报错
  17. // System.out.println(op3.get());
  18. if (op1.isPresent()) {
  19. System.out.println(op1.get());
  20. } else {
  21. System.out.println("没有值");
  22. }
  23. }

1.6 Optional的高级使用


image.pngimage.png

image.png

@Test
public void test05() {
    User u = new User("Hello", 18);
    // getUpperUserName1(u);
    Optional<User> op = Optional.of(u);
    System.out.println(getUpperUserName2(op));
}

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

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


@Test
public void test04() {
    Optional<String> userNameO = Optional.of("凤姐");
    // Optional<String> userNameO = Optional.empty();

    // 存在做的什么
    // ifPresent: 如果有值就调用参数
    /*userNameO.ifPresent(s -> {
            System.out.println("有值: " + s);
        });*/

    // ifPresentOrElse: 存在做的什么,不存在做点什么
    userNameO.ifPresentOrElse(s -> {
        System.out.println("有值: " + s);
    }, () -> {
        System.out.println("没有值");
    });
}

@Test
public void test03() {
    // Optional<String> userNameO = Optional.of("凤姐");
    Optional<String> userNameO = Optional.empty();

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

1.7 小结


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