java8新特性-Optional

简介: java8新特性-Optional

1.简介

Java 8引入了一个重要的新特性,即Optional类。Optional类是为了解决空指针异常而设计的。

在Java中,当我们尝试访问一个空对象的属性或调用其方法时,很容易抛出NullPointerException。这种异常可能会导致程序崩溃或产生意外结果。

Optional类的目的是提供一种更好的处理空值的方式。它可以包含一个非空的对象,也可以表示一个空值。使用Optional类,我们可以避免直接操作空对象,从而减少NullPointerException的发生。

2.Optional类常用方法

后面的示例代码主要用到map、orElse、ifPresent方法

1.map(Function<? super T,? extends U> mapper):如果Optional对象包含一个非空的值,则将该值应用给定的函数进行转换,并返回一个新的Optional对象,用于存储转换后的结果;否则返回一个空的Optional对象。

2.ofNullable(T value):如果value不为null,则返回一个包含该value的Optional对象;否则返回一个空的Optional对象。

3.isPresent():如果Optional对象包含一个非空的值,则返回true;否则返回false。

4.get():如果Optional对象包含一个非空的值,则返回该值;否则抛出NoSuchElementException异常。

5.orElse(T other):如果Optional对象包含一个非空的值,则返回该值;否则返回other。

6.ifPresent(Consumer<? super T> consumer):如果Optional对象包含一个非空的值,则对该值执行给定的操作;否则不做任何操作。

3.示例代码

我们来看一段代码

public static void main(String[] args) {
 
        User user=null;
        //模拟不确定的空对象
        Random random = new Random();
        if(random.nextInt(11)>5){
           user= new User("Bob");
        }
        
        //把名字转成小写
        user.setName(user.getName().toLowerCase());
        System.out.println(user.getName());
 
    }

在这段代码中存在潜在的空指针异常风险。如果随机数小于等于5,则 user 对象为 null,调用 user.getName() 方法会导致空指针异常。

应该在调用 getName() 方法前先进行非空判断。

我们先看传统的手动判空处理

 public static void main(String[] args) {
 
        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }
 
        // 把名字转成小写
        if (user != null && user.getName() != null) {
            user.setName(user.getName().toLowerCase());
            System.out.println(user.getName());
        } else {
            System.out.println("用户对象为空或用户名为空");
        }
    }

相较于这种传统的手动判空方法我们可以使用更优雅的方法Optional

  public static void main(String[] args) {
        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }
 
        // 使用Optional类来包装空对象
        //Lambda表达式链式处理写法
        Optional<String> optionalS1 = Optional.ofNullable(user).map(u->u.getName()).map(name->name.toLowerCase());
        // 输出结果,若空则设置默认值为MiJiu
        System.out.println(optionalS1.orElse("MiJiu"));
        //非空则输出结果
        optionalS1.ifPresent(s->System.out.println(s));
 
        System.out.println("--------------------------------");
 
        //用方法引用简化
        Optional<String> optionalS2 = Optional.ofNullable(user).map(User::getName).map(String::toLowerCase);
        System.out.println(optionalS2.orElse("MiJiu"));
        optionalS1.ifPresent(System.out::println);
 
 
    }

有关什么是Lambda表达式可以看这篇

有关什么是方法引用可以看这篇

4.示例代码仓库地址

目录
相关文章
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
609 94
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
467 0
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
659 1
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
1182 1
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
715 0
|
存储 人工智能 Java
Java 8 的 Optional:提高代码安全性与可读性
本文深入解析 Java 中的 `NullPointerException` 及其传统处理方式,并介绍了 Java 8 引入的 `Optional` 类。通过示例代码讲解了 `Optional` 的创建、使用及其 API,探讨了其在实际开发中的最佳实践与局限性,帮助开发者提升代码的健壮性与可读性。
232 0
Java 8 的 Optional:提高代码安全性与可读性