jdk都出到16了8还没掌握吗?挽周带你玩转java8新特性(建议收藏)(四)

简介: jdk都出到16了8还没掌握吗?挽周带你玩转java8新特性(建议收藏)

五.Optional类


Optional类可以优雅的处理空指针异常。它可以保存T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。


Optional提供了很多方法,这样我们就不用显式进行空值检测。

【创建实例对象】


创建Optional类对象方法 描述
of(T t) 创建一个Optional实例 t 必须非空
empty() 创建一个空的 Optional 实例
ofNullable(T t) t 可以为 null

通过 of() 方法创建对象,school 不能为空,为空则抛出控制值异常

public class LambdaTest {
  @Test
  public void test() {
    School school=new School();
    Optional<School> optionalSchool = Optional.of(school);
  }
}

20210607163736249.png

public class LambdaTest {
  @Test
  public void test() {
    School school=new School();
    school=null;
    Optional<School> optionalSchool = Optional.of(school);
  }
}

20210607163941230.png

通过 ofNullable(school) 创建对象,school 可以为空

public class LambdaTest {
  @Test
  public void test() {
    School school=new School();
    school=null;
    Optional<School> optionalSchool = Optional.ofNullable(school);
    System.out.println(optionalSchool);
  }
}

20210607164218466.png

【对容器中对象进行操作】

判断Optional容器中是否包含对象方法 描述
boolean isPresent() 判断是否包含对象
boolean ifPresent(Consumer<? super T> consumer) 如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它


Optional对象的 isPresent() 方法使用

public class LambdaTest {
  @Test
  public void test() {
    School school=new School();
    school=null;
    Optional<School> optionalSchool = Optional.ofNullable(school);
    System.out.println(optionalSchool.isPresent());
  }
}

20210607164557701.png

【获取容器的对象】

获取Optional容器的对象方法 描述
T get() 如果调用对象包含值,返回该值,否则抛异常
T orElse(T other) 如果有值则将其返回,否则返回指定的other对象
T orElseGet(Supplier<? extends T> other) 如果有值将其返回,否则返回由Supplier接口实现提供的对象
T orElseThrow(Supplier<? extends X> exceptionSupplier) 如果有值将其返回,否则返回由Supplier接口实现提供的异常


orElse 方法

public class OptionalTest {
    //内部类
    public class Student{
        public Student() {
        }
        public Student(Integer id, String name) {
            this.id = id;
            this.name = name;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        private Integer id;
        private String name;
    }
    @Test
    public void test(){
        String name = getStudentName(new Student(1, "小五"));
        System.out.println(name);
    }
    private String getStudentName(Student student){
        //ofNullable()可以接收student为null
        Optional<Student> optional = Optional.ofNullable(student);
        //如果当前的optional内部封装的student不为空,则返回内部的studetn如果为空,则返回.orElse(new Student(1, "张三"))方法中的参数
        return optional.orElse(new Student(1, "张三")).getName();
    }
}

20210607201434234.png

public class OptionalTest {
    //内部类
    public class Student{
        public Student() {
        }
        public Student(Integer id, String name) {
            this.id = id;
            this.name = name;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        private Integer id;
        private String name;
    }
    @Test
    public void test(){
        String name = getStudentName(null);
        System.out.println(name);
    }
    private String getStudentName(Student student){
        //ofNullable()可以接收student为null
        Optional<Student> optional = Optional.ofNullable(student);
        //如果当前的optional内部封装的student不为空,则返回内部的studetn如果为空,则返回.orElse(new Student(1, "张三"))方法中的参数
        return optional.orElse(new Student(1, "张三")).getName();
    }
}

20210607201548806.png

如果明确知道数据就是非空可以搭配使用:of() + get()

如果要避免空指针的话可以搭配使用:ofNullable()+orElse()


总体来说Java8大部分都是语法相关,部分方法没有演示,看完之后一定要多练习,熟能生巧。


相关文章
|
11月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
399 0
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
562 1
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
1085 1
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
634 0
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
522 1
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
760 0
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
375 2