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

发布时间:2024年01月15日

在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 时,我们需要权衡其优点和缺点,并根据实际情况做出决策。

文章来源:https://blog.csdn.net/luxiaol/article/details/135520893
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。