首页 > 编程语言 >JAVA8新特性——Optional

JAVA8新特性——Optional

时间:2024-09-20 22:20:14浏览次数:10  
标签:ofNullable Author author 特性 public null Optional JAVA8

Optional 是 Java 8 引入的新特性之一,它是一个容器类,代表一个可能包含或者不包含实际对象的值。其目的是为了减少代码中空指针异常(NullPointerException)的发生,并使得代码更加安全和易读。使用 Optional 可以避免直接返回 null,从而减少空值检查。

Optional对象的创建

Optional 类提供了几种创建方式:

Optional.of(T value):当值非 null 时使用此方法创建 Optional 对象,如果传入 null,将抛出 NullPointerException。
Optional.empty():创建一个没有值的 Optional 对象。
Optional.ofNullable(T value):允许传入 null 值,如果值为 null,则返回一个空的 Optional,否则返回包含该值的 Optional。
我们一般采用第三种方式创建Optional对象

demo
Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
Optional.ofNullable的等价写法
public static Optional<Author> getAuthorOptional(){
        Author author = new Author(1L, "蒙多", 33, "eee", null);
        //return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
        return author == null ? Optional.empty() : Optional.of(author);
    }

我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象,无论传入的参数是否为null都不会出现问题

安全的消费值

我们获取Optional对象后肯定需要对其中的数据进行使用,这时候我们可以使用ifPresent方法来消费其中的值。该方法会判断封装的数据是否为空,不为空时才执行具体的消费代码,这样就更加安全了。

demo
import java.util.Optional;
import java.util.function.Consumer;

public class OptionalDemo {
    public static void main(String[] args) {
        Author author = getAuthor();
        Optional<Author> authorOptional = Optional.ofNullable(author);
       authorOptional.ifPresent(author12 -> System.out.println(author12.getName()));
    }
}

获取值

我们可以通过get方法获取值。如果存在值,则返回该值,否则抛出 NoSuchElementException.很显然,因为可能抛出异常,所以我们不推荐这种方式。

import java.util.Optional;
import java.util.function.Consumer;

public class OptionalDemo {
    public static void main(String[] args) {
        Optional<Author> authorOptional1 = getAuthorOptional();
        Author author1 = authorOptional1.get();
        System.out.println(author1);
    }

    public static Optional<Author> getAuthorOptional(){
        Author author = new Author(1L, "蒙多", 33, "eee", null);
        return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
        //return author == null ? Optional.empty() : Optional.of(author);
    }
}

安全获取值

orElseGet(Supplier<T> supplier):如果有值则返回该值,否则返回由 Supplier 提供的值。

Optional<Author> authorOptional1 = getAuthorOptional();
        authorOptional1.orElseGet(new Supplier<Author>() {
            @Override
            public Author get() {
                return new Author();
            }
        });

orElseThrow(Supplier<? extends Throwable> exceptionSupplier):如果有值则返回该值,否则抛出由 Supplier 创建的异常。

Optional<Author> authorOptional1 = getAuthorOptional();
authorOptional1.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("数据为null"));

过滤

filter(Predicate<T> predicate):参考Stream

判断

isPresent():如果存在值则返回 true

数据转换

map 方法接收一个函数作为参数,并将其应用于Optional中的值,返回一个新的Optional对象,该对象包含应用函数后的结果。如果原始的Optional对象为空,则返回的Optional也是空的。参考Stream

标签:ofNullable,Author,author,特性,public,null,Optional,JAVA8
From: https://blog.csdn.net/m0_73731267/article/details/142401291

相关文章

  • 什么是“晃电”,介绍3种抗晃电装置的原理和特性
    “晃电”是指因雷击、瞬间短路或其他原因引起电网电压波动或短时断电的现象,其中电压暂降是指电压有效值降至额定工作电压的10%~90%,持续时间在10ms~600ms的晃电,工业现场的电机主要有直接起动、变频起动和软起动等控制方式,直接起动通过接触器自保持回路构成,接触器能够保持的参数为......
  • Rocksdb 6.3.6 ~ 6.29.5 重要版本特性
    6.20.0(2021-04-16)修复了在分布式/网络文件系统中,当服务器成功但客户端返回错误时处理文件重命名错误的错误。该错误会导致CURRENT文件指向不存在的MANIFEST文件,从而无法打开DB。6.19.0(2021-03-21)在flush过程中,只有WALsync可重试IOerror才会被映射到hard......
  • C++标准的一些特性记录:C++11的thread_local
    文章目录thread_localthread_local在多线程的编程环境里,一般来说,所有的线程都是共享同一个内存空间,也就是说如果定义一个变量,这个变量是被所有线程共享的,所以多个变量在访问同一个变量时,是需要加锁机制的,否则就会出现问题。在C++11中,引入了一个关键字thread_local......
  • Java 23 的12 个新特性!!
    Java23来啦!和Java22一样,这也是一个非LTS(长期支持)版本,Oracle仅提供六个月的支持。下一个长期支持版是Java25,预计明年9月份发布。Java23一共有12个新特性!有同学表示,Java8还没学完呢,又要学新特性?人麻了啊。。。别担心,其实改动并不大!我抽时间认真看了一下新......
  • Java8的Optional简介
    文章目录环境背景方法1:直接获取方法2:防御式检查方法3:Java8的Optional概述map()测试flatMap()测试总结参考注:本文主要参考了《Java8实战》这本书。环境Ubuntu22.04jdk-17.0.3.1(兼容Java8)背景现有Insurance、Car、Person类,定义如下:Insurance:publ......
  • C++笔记21•C++11的新特性•
       相比于 C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而......
  • centos789手动无脑用sh脚本安装Java8
    #老师给的文件是jdk1.8版本,所以我这边写的也是8的脚本输入命令:mkdir–p/export/data#放置相关的数据文件输入命令mkdir–p/export/servers#软件的安装目录输入命令:mkdir–p/export/software上传文件jdk-8u241-linux-x64.tar.gz到/export/software目录然后写一个安装......
  • centos789手动无脑用sh脚本安装Java8
    #老师给的文件是jdk1.8版本,所以我这边写的也是1.8的脚本输入命令:mkdir–p/export/data#放置相关的数据文件输入命令mkdir–p/export/servers#软件的安装目录输入命令:mkdir–p/export/software上传文件jdk-8u241-linux-x64.tar.gz到/export/software目录然后写一个安......
  • 浅谈解释型语言 PHP 和编译型语言 Go 特性
    浅谈解释型语言PHP和编译型语言Go特性分享人:zxy_coding时长:40min写在前面本次分享的目的旨在互相交流,欢迎会后大家多多讨论交流。不会花过多的时间在细节上,同时请各位大佬轻喷。在分享之前,请允许我简单的带大家温习下一些会提到的点:高级语言vs低级语言:这两者是一......
  • Java SE 23 新增特性4C
    JavaSE23新增特性作者:Grey原文地址:博客园:JavaSE23新增特性CSDN:JavaSE23新增特性源码源仓库:Github:java_new_featuresPrimitiveTypesinPatterns,instanceof,andswitch(预览功能)通过instanceof和switch,我们可以检查对象是否属于特定类型,如果是,则将该对......