资讯专栏INFORMATION COLUMN

Java中的Optional类

JerryC / 2307人阅读

摘要:工具类基本概念类的使用对象创建常用方法基本概念类是一个可以为的容器对象可以保存指定类型的值也可以只保存要么有值要么为中提供很多方法来避免显式的进行空值检查如果值存在则调用方法会返回调用方法就会返回这个对象类是一个没有子类的

基本概念

  • Optional类:
    • Optional是一个可以为null的容器对象.可以保存指定类型的值,也可以只保存null. 要么有值,要么为null
    • Optional中提供很多方法来避免显式的进行空值检查.如果值存在则调用isPresent() 方法会返回true, 调用get() 方法就会返回这个对象
    • Optional类是一个没有子类的工具类,很好的解决了空指针异常问题

Optional类的使用

  • Java 8以前,通常使用if…else… 对对象进行是否为空的判断,然后再进行逻辑处理,这样的代码非常冗余
  • Java 8中新增了Optional类,使用这个类可以避免空指针检查,使代码更加优雅

Optioanl对象创建

of

  • of() 方法不支持null对象
Optional.of(T t);

ofNullable

  • ofNullable() 方法支持null对象
Optional.ofNullable();

empty

  • empty() 方法可以直接创建一个空的Optional对象
Optional.empty();

Optional常用方法

isPresent

  • isPresent(): 判断是否包含值
    • 如果包含值则返回true
    • 如果不包含值则返回false
Optional<Object> optional = Optional.empty();// falseboolean optionalPresent = optional.isPresent();

get

  • get(): 获取包含的值
    • 如果有值则返回这个值
    • 否则抛出NoSuchElementException: No value present异常
Optional<Object> optional = Optional.empty();// NoSuchElementException: No value presentObject o = optional.get();

orElse

  • orElse(str): 如果调用对象包含值则返回这个值,否则返回参数字符串str
String message = optional.orElse("Optional对象的值为空!");

orElseGet

  • orElseGet(supplier): 如果调用对象包含值则返回这个值,否则返回Lambda表达式获取的值
  • orElseGet()orElse() 比较:
    • orElseGet()orElse() 类似,只是传递的参数类型不同
    • orElseGet() 的参数是Lambda类型
    • orElse() 的参数是String类型
String value = optional.orElseGet(() -> "Optional对象的值为空!");

orElseThrow

  • orElseThrow(exceptionSupplier): 如果调用对象包含值则返回这个值,否则抛出Lambda表达式中Supplier继承的异常
String value = optional.orElseThrow(() -> new RunTimeExeception("Optional对象中的值不存在!"));

map

  • map(): 如果调用的对象有值,则进行处理,并且返回处理后的Optional对象.否则返回Optional.empty()
  • Optional中的map() 方法和Stream流中的map() 方法类似,可以用于类型转换等操作
Optional<String> map = optional.map(p -> p.getName());

flatMap

  • flatMap(): 如果调用的对象有值,则执行mapping函数返回Optional类型的值.否则返回空Optional对象Optional.empty()
  • flatMap()map() 比较:
    • Optional中的flatMap()map() 方法类型,区别只是在于mapping的返回值不同
    • map() 方法的mapping函数返回值可以是任何类型的对象,在map() 方法返回之前会包装为Optional对象
    • flatMap() 方法的mapping函数调用对象必须是Optional对象,调用结束后 ,flatMap() 中不会对结果使用Optional进行封装
// map()方法Optional<String> map = optional.map(p -> p.getName());// flatMap()方法Optional<String> flatMap = optional.flatMap(p -> Optional.of(p.getName()));

filter

  • filter(predicate): 通过传入的Predicate限定条件对Optional对象中的值进行过滤. 如果Optional对象中有值并且满足Predicate过滤条件,就返回包含这些值的Optional对象,否则返回空Optinal对象Optional.empty()
String filter = optional.filter(s -> s.length > 0).orElse("Optional对象中的值不存在!");

ifPresent

  • ifPresent(consumer): 如果调用的对象包含值则使用对象的值调用consumer处理.否则不进行任何操作
optional.ifPresent(System.out :: println);

ifPrsentOrElse

  • ifPresentOrElse(): Java 9以后的方法.如果调用的对象包含值则使用对象的值调用consumer.否则执行自定义的Runnable操作
optional.ifPresentOrElse((str) -> System.out.println(str.toUpperCase()), () -> System.out.println("Optional对象中的值不存在!"));

equals

  • equals(): 判断其余对象是否和Optional对象相等
boolean flag = optional.equals(obj);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124706.html

相关文章

  • Java8新特性总览

    摘要:新特性总览标签本文主要介绍的新特性,包括表达式方法引用流默认方法组合式异步编程新的时间,等等各个方面。还有对应的和类型的函数连接字符串广义的归约汇总起始值,映射方法,二元结合二元结合。使用并行流时要注意避免共享可变状态。 Java8新特性总览 标签: java [TOC] 本文主要介绍 Java 8 的新特性,包括 Lambda 表达式、方法引用、流(Stream API)、默认方...

    mayaohua 评论0 收藏0
  • Java 8 新特性之Optional

    摘要:概述简介类是一个容器类,代表一个值存在或不存在,原来用表示一个值不存在,现在可以更好的表达这个概念,并且可以避免空指针异常。否则返回字符串长度为与类似,要求返回值必须是字符串长度为本文首发于凌风博客新特性之类作者凌风 1. 概述 1.1 简介 Optional 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Op...

    Little_XM 评论0 收藏0
  • java 8 实战》读书笔记 -第十章 用Optional取代null

    摘要:但返回的是一个类型的对象,这意味着操作的结果是一个类型的对象。反之,如果对象存在,这次调用就会将其作为函数的输入,并按照与方法的约定返回一个对象。 一、Optional 类入门 Java 8中引入了一个新的类java.util.Optional。变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个空的Optional对象,由方法Optional.empt...

    时飞 评论0 收藏0
  • Java8实战》-第十章笔记(用Optional取代null)

    摘要:是第一批在堆上分配记录的类型语言之一。实际上,的这段话低估了过去五十年来数百万程序员为修复空引用所耗费的代价。很明显,这种方式不具备扩展性,同时还牺牲了代码的可读性。是目前程序开发中最典型的异常。完成这一任务有多种方法。 用Optional取代null 如果你作为Java程序员曾经遭遇过NullPointerException,请举起手。如果这是你最常遭遇的异常,请继续举手。非常可惜,...

    flybywind 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<