专业的编程技术博客社区

网站首页 > 博客文章 正文

java 8 新特性 新增的Optional类(java新特性)

baijin 2024-10-09 07:54:26 博客文章 7 ℃ 0 评论

以前对null的处理方式

@Test
public void test01() {
    String userName = "凤姐";
    
    // String userName = null;
    if (userName != null) {
        System.out.println("用户名为:" + userName);
   } else {
        System.out.println("用户名不存在");
    }
}

Optional类介绍

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

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()
@Test
public void test02() {
    // Optional<String> userNameO = Optional.of("凤姐");
    // Optional<String> userNameO = Optional.of(null);
    // Optional<String> userNameO = Optional.ofNullable(null);
    Optional<String> userNameO = Optional.empty();

    // isPresent() : 判断是否包含值,包含值返回true,不包含值返回false。
    if (userNameO.isPresent()) {
        // get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException。
        String userName = userNameO.get();
        System.out.println("用户名为:" + userName);
    } else {
         System.out.println("用户名不存在");
    }
}

Optional的高级使用

@Test
public void test03() {
    Optional<String> userNameO = Optional.of("凤姐");
    // Optional<String> userNameO = Optional.empty();
    // 存在做的什么
    // userNameO.ifPresent(s -> System.out.println("用户名为" + s));
    // 存在做的什么,不存在做点什么
    userNameO.ifPresentOrElse(s -> System.out.println("用户名为" + s)
             , () -> System.out.println("用户名不存在"));
}

@Test
public void test04() {
    // Optional<String> userNameO = Optional.of("凤姐");
    Optional<String> userNameO = Optional.empty();
    // 如果调用对象包含值,返回该值,否则返回参数t
    System.out.println("用户名为" + userNameO.orElse("null"));

    // 如果调用对象包含值,返回该值,否则返回参数Supplier得到的值
    String s1 = userNameO.orElseGet(() -> {return "未知用户名";});
    System.out.println("s1 = " + s1);
}
@Test
public void test05() {
    // User u = new User("凤姐", 18);
    // User u = new User(null, 18);
    // User u = null;
    // System.out.println(getUpperCaseUserName1(u));
    // 我们将可能会为null的变量构造成Optional类型
    // User u = new User("凤姐", 18);
    User u = new User(null, 18);
    Optional<User> uO = Optional.of(u);
    System.out.println(getUpperCaseUserName2(uO));
}

public String getUpperCaseUserName2(Optional<User> uO) {
    return uO.map(u -> u.getUserName())
            .map(name -> name.toUpperCase())
            .orElse("null");
}

/*public String getUpperCaseUserName1(User u) {
    if (u != null) {
    String userName = u.getUserName();
    if (userName != null) {
        return userName;
    } else {
        return null;
    }
    } else {
        return null;
    }
}*/

小结

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表