首页 > 编程语言 >Java8中Optional类的认识和用法

Java8中Optional类的认识和用法

时间:2023-11-16 10:32:52浏览次数:36  
标签:ofNullable String empl 用法 println Optional Java8 name

      Optional在Java 8中引入,目的是解决  NullPointerExceptions的问题。 它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在, Optional 可以更好的表达这个概念。并且可以避免空指针异常。这样我们就不用显式进行空值检测。

一、构建Optional对象(Optional.of(T value) 或Optional.ofNullable(T value))

         Optional.of(T value):构造一个Optional对象,入参必须不会空,如果入参是空,就抛出空指针异常。

        Optional.ofNullable(T value):构造一个Optional对象,入参可以是空,如果入参是空,就返回Optional.empty()。

Optional<String> optional = Optional.of("MyOptionalTest");
Optional<String> optionalValue = Optional.ofNullable("这个世界是美好的!");
Optional.of(new Empl("1111","测试人员1", "男"))

二、获取Optional对象的值

Optional<String> optional = Optional.of("MyOptionalTest");
String str=optional.get();

三、ifPresent():如果 Optional 对象中的值存在,则会执行该参数实例的 accept 方法,并传入 Optional 中包含的值,否则不做任何操作。

Optional<String> optionalValue = Optional.ofNullable("这个世界是美好的!");
Optional<Integer> lengthOptional = optionalValue.map(String::length);
lengthOptional.ifPresent(len -> System.out.println("Length is: " + len));

四、处理转换操作:map(Function<? super T, ? extends U> mapper):将Optional对象中的值进行转换,并返回一个包含转换结果的新Optional对象。

Optional<String> optionalValue = Optional.ofNullable("这个世界是美好的!");
Optional<Integer> lengthOptional = optionalValue.map(String::length);

补充说明:

map和flatMap的区别:

如果某对象实例的属性本身就为Optional包装过的类型,那么就要使用flatMap方法,

Dept::getEmpl 返回的就是Optional<Empl>类型的,所以不用再使用Optional进行包装,这时就要选用flatMap方法.

对于返回值是其他类型,需要Optional进行包装,如 Empl::getName得到是String类型的, 就需要使用map方法在其外面包装一层Optional对象。个Optional对象,入参可以是空,如果入参是空,就返回Optional.empty()

比如:

public class Dept {
    private String name;
    private Optional<Empl> empl;  //属性为Option封装的Empl对象
    public Dept(String name, Optional<Empl> empl) {
        this.name = name;
        this.empl = empl;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Optional<Empl> getEmpl() {
        return empl;
    }
    public void setEmpl(Optional<Empl> empl) {
        this.empl = empl;
    }
}

Java8中Optional类的认识和用法_空指针异常

正确写法:

Dept dept=new Dept("测试部",Optional.of(new Empl("1111","测试人员1", "男")));
String emplname= Optional.ofNullable(dept)
        .flatMap(Dept::getEmpl)
        .map(Empl::getName)
        .orElse("false");
System.out.println("emplname===="+emplname);

Java8中Optional类的认识和用法_空指针异常_02


五、处理过滤操作:filter(Predicate<? super T> predicate):对Optional对象中的值进行过滤操作,返回一个满足条件的Optional对象。

Optional<String> filteredOptional = optionalValue.filter(v -> v.contains("美好"));
filteredOptional.ifPresent(v -> System.out.println("Filtered value is: " + v));
Stream<String> names = Stream.of("张三", "李四", "王二");
Optional<String> nametest = names
        .filter(name -> name.startsWith("王"))//过滤出王姓人员
        .findFirst();
nametest.ifPresent(name -> {
    String s = name.substring(0,1);//对名称进去其他操作
    System.out.println("The nametest name is "+ s);
});

  六、orElseThrow():该方法获取 Optional 对象中包含的值,如果该值为 null,则抛出指定的异常。

Optional<String> optional1 = Optional.of("11111");
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseThrow(() -> new IllegalStateException("can't get value")));
System.out.println(optional2.orElseThrow(() -> new IllegalStateException("can't get value")));

Java8中Optional类的认识和用法_容器对象_03

七、orElse():该方法获取 Optional 对象中包含的值,如果该值为 null,则返回指定的默认值。

Optional optional1 = Optional.of("1111");
Optional optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElse("22222"));
System.out.println(optional2.orElse("33333"));

Java8中Optional类的认识和用法_Optional_04


标签:ofNullable,String,empl,用法,println,Optional,Java8,name
From: https://blog.51cto.com/u_16304399/8413875

相关文章

  • React.Children.map的用法
    React.Children用很多用法,如下图,经常会用到的是toArray(),具体用法可以自行了解,这里记录下map()的用法和使用到的场景。1.用法:React.Children.map接收2个参数,第一个是所有子元素,第二个是个回调,可以对每个子元素进行处理,然后返回处理后的子元素。2.使用场景:子元素(也可理解为......
  • 流倒序排序_java8 stream多字段排序
      //返回对象集合以类属性一升序排序list.stream().sorted(Comparator.comparing(类::属性一));//返回对象集合以类属性一降序排序注意两种写法list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行属性一降序list.stream()......
  • 实用干货丨Eolink Apikit 配置和告警规则的各种用法
    API在运行过程中可能会遇到各种异常情况,如响应时间过长、调用频率过高、请求参数错误等,这些异常会对系统的稳定性和性能产生严重影响。因此,对API进行异常监控和告警是非常必要的。本文将介绍EolinkApikit中使用的告警规则,帮助开发者和运维人员更好地监控和管理API。全局告警......
  • Python3 协程 await async 相关的用法和笔记
    想要提供可以进行协程切换的awaitable,可以使用下面的方法:1任务taskasyncdeffunc():print("yesWait")task=asyncio.create_task(func())awaittask2协程对象,可以使asyncdef定义的协程函数(是否能触发切换不一定,要看函数内容)函数内可以利用asyncio.sl......
  • git 简洁用法
    开发分支(dev)上的代码达到上线的标准后,要合并到master分支gitcheckoutdevgitpullgitcheckoutmastergitmergedevgitpush-uoriginmaster当master代码改动了,需要更新开发分支(dev)上的代码gitcheckoutmastergitpullgitcheckoutdevgitmergemastergit......
  • TypeScript的5个常见用法
    TypeScript是一种静态类型的JavaScript超集,它提供了额外的类型系统和一些ECMAScript新特性的支持。以下是TypeScript的一些常见用法:1:类型注解:TypeScript允许在变量、函数、参数、返回值等地方添加类型注解,明确指定变量的类型。例如:letname:string='John';functiongr......
  • 数据库操作入门:PyMongo 和 MongoDB 的基本用法
    MongoDBMongoDB是一种流行的NoSQL数据库,它将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展PyMongoPython需要一个MongoDB驱动程序来访问MongoDB数据库。在本教程中,我们将使用MongoDB驱动程序"PyMongo"。建议使用PIP来安装"PyMongo",确保您的Python环境已安装PIP。在命......
  • Java -- Stream流用法
    1.前言流是Java8API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式。Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据......
  • 索引的用法
    s='hellowrold'foriinrange(0,len(s)):#len()是计算序列s的长度函数,即h-d的字母个数print(i,s[i],end='\t\t')#第一个i是索引从0开始,到len(s)计算的个数结束;#s[i]是便利s序列中每个对应的元素,0是h,1是e以此类推......
  • JavaScript slice 方法用法与实例解析
    在JavaScript中,slice()是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍slice()的基本概念、使用方法、实践案例和互动练习,以帮助你更好地理解和掌握这一功能......