当前位置: 首页 > news >正文

常用Java代码-Java中的Optional类和null安全编程

在Java中,Optional 是一个可以为null的容器对象。如果值存在则isPresent()方法返回true。调用get()方法会返回值,如果值为null则抛出NullPointerException。以下是一个详细的代码详解。

在之前的Java版本中,程序员需要手动检查是否为null,以防止NullPointerException。例如:

String str = someMethodThatReturnsString();
if (str != null) {System.out.println(str.trim());
}

如果str是null,上面的代码将会抛出NullPointerException。为了防止这种情况,开发者必须确保在使用对象之前检查它是否为null。这增加了代码的复杂性,并可能导致逻辑错误。

Java 8引入了Optional 类型,它是一个可以为null的容器对象。如果值存在则isPresent()方法返回true。调用get()方法会返回值,如果值为null则抛出NullPointerException。

使用Optional 可以简化代码并提高代码的可读性。例如:

Optional<String> optionalStr = Optional.ofNullable(someMethodThatReturnsString());
optionalStr.ifPresent(System.out::println);

如果someMethodThatReturnsString()方法返回null,上面的代码将不会抛出NullPointerException。相反,ifPresent()方法将不会执行任何操作。

你也可以使用Optional 链式调用方法来访问对象的属性:

public class Person {private String name;private Address address;// getters and setters
}public class Address {private String street;// getters and setters
}Person person = new Person();
person.setName("John");
person.setAddress(new Address());
person.getAddress().setStreet("123 Main St");Optional<String> optionalStreet = Optional.ofNullable(person.getAddress()).map(Address::getStreet);
optionalStreet.ifPresent(System.out::println); // prints "123 Main St" if person's address is not null, otherwise does nothing.

在这个例子中,我们首先检查person的地址是否为null。如果不是null,我们使用map()方法来获取地址的街道。然后我们使用ifPresent()方法来打印街道,如果地址不是null的话。如果地址是null,ifPresent()方法将不会执行任何操作。

Optional的使用不仅可以避免NullPointerException`,而且还可以帮助我们写出更优雅、更简洁的代码。

此外,Optional 还有一个非常有用的方法叫做 orElseorElseGet,它们可以在值不存在的时候提供一个默认值。例如:

String name = person.getName();
String defaultName = "Unknown";
String resultName = Optional.ofNullable(name).orElse(defaultName);

在这个例子中,如果 namenullresultName 就会被赋值为 "Unknown"。如果 name 不是 nullresultName 就会被赋值为 name

值得注意的是,尽管 Optional 有很多优点,但是如果过度使用或不恰当使用,它可能会使代码变得复杂和难以理解。因此,在使用 Optional 时,我们需要权衡其优点和缺点,并根据实际情况做出决策。

http://www.lryc.cn/news/280774.html

相关文章:

  • android.os.NetworkOnMainThreadException
  • Java生成四位数随机验证码
  • 编程探秘:Python深渊之旅-----数据可视化(八)
  • 上海亚商投顾:创业板指冲高回落 光伏、航运股逆势走强
  • Python3 中常用字符串函数介绍
  • Python - 深夜数据结构与算法之 AVL 树 红黑树
  • Zookeeper使用详解
  • C#属性(Property)
  • 在docker中搭建部署clickhouse
  • 第九部分 使用函数 (三)
  • 基础命令继续
  • uni-app做A-Z排序通讯录、索引列表
  • Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)
  • springboot集成kafka消费数据
  • 单例模式---JAVA
  • maven管理使用
  • 如何在一个系统中同时访问异构的多种数据库
  • 半监督学习 - 半监督聚类(Semi-Supervised Clustering)
  • 实现STM32烧写程序-(3) Hex文件结构
  • 精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略
  • 自然语言处理5——发掘隐藏规律 - Python中的关联规则挖掘
  • 【记录】重装系统后的软件安装
  • Android 13 - Media框架(31)- ACodec(七)
  • 快速了解VR全景拍摄技术运用在旅游景区的优势
  • 分布形态的度量_峰度系数的探讨
  • HCIP 重发布
  • FX图中的节点代表什么操作
  • 【Java 设计模式】创建型之单例模式
  • FlinkAPI开发之窗口(Window)
  • 【Unity】Joystick Pack摇杆插件实现锁四向操作