java中使用Optional类处理NPE问题-----知识点学习

Optional 类
为了更好的解决和避免常见的 NPE 问题,Java 8 中引入了一个新的类 java.util.Optional,Optional 值可以为 null,如果值存在,调用 isPresent() 方法返回 true,调用 get() 方法可以获取值。
创建 Optional 对象
Optional 类提供类三个方法用于实例化一个 Optional 对象,它们分别为 empty()、of()、ofNullable(),这三个方法都是静态方法,可以直接调用。

empty() 方法用于创建一个没有值的Optional对象:

Optional emptyOpt = Optional.empty();
empty() 方法创建的对象没有值,如果对 emptyOpt 变量调用 isPresent() 方法会返回 false,调用 get() 方法抛出 NPE 异常。

of() 方法使用一个非空的值创建Optional对象:

String str = "Hello World";
Optional<String> notNullOpt = Optional.of(str);
// ofNullable() 方法接收一个可以为null的值:

Optional<String> nullableOpt = Optional.ofNullable(str);
// 如果 str 的值为 null,得到的 nullableOpt 是一个没有值的 Optional 对象。

// 获取 Optional 对象中的值
// 如果我们要获取 User 对象中的 roleId 属性值,常见的方式是直接获取:

String roleId = null;
if (user != null) {
    roleId = user.getRoleId();
}

使用 Optional 中提供的 map() 方法可以更简单地实现:

Optional<User> userOpt = Optional.ofNullable(user);
Optional<String> roleIdOpt = userOpt.map(User::getRoleId);

// 使用 orElse()方法获取值

Optional 类还包含其他方法用于获取值,这些方法分别为:

  • orElse():如果有值就返回,否则返回一个给定的值作为默认值
  • orElseGet():与 orElse() 方法作用类似,区别在于生成默认值的方式不同。该方法接受一个 Supplier<? extends T> 函数式接口参数,用于生成默认值
  • orElseThrow():与前面介绍的 get() 方法类似,当值为 null 时调用这两个方法都会抛出 NPE 异常,区别在于该方法可以指定抛出的异常类型
    下面来 看看这三个方法的具体用法:
String str = "Hello World";
Optional<String> strOpt = Optional.of(str);
String orElseResult = strOpt.orElse("Hello BeiJing");
String orElseGet = strOpt.orElseGet(() -> "Hello BeiJing");
String orElseThrow = strOpt.orElseThrow(
        ()-> new IllegalArgumentException("Argument 'str' cannot be null or blank."));

此外,Optional 类还提供了一个 ifPresent() 方法,该方法接收一个 Consumer<? super T> 函数式接口,一般用于将信息打印到控制台:

Optional strOpt = Optional.of(“Hello World”);
strOpt.ifPresent(System.out::println);
使用 filter() 方法过滤

filter() 方法可用于判断 Optional 对象是否满足给定条件,一般用于条件过滤:

Optional optional = Optional.of(“wupx94@qq.com”);
optional = optional.filter(str -> str.contains(“wupx”));
在上面的代码中,如果 filter() 方法中的 Lambda 表达式成立,filter() 方法会返回当前 Optional 对象值,否则,返回一个值为空的 Optional 对象。

关于 Optional 使用建议:

尽量避免在程序中直接调用 Optional 对象的 get() 和 isPresent() 方法
避免使用 Optional 类型声明实体类的属性
Optional 实践
上面提到创建 Optional 对象有三个方法,empty() 方法比较简单,主要是 of() 和 ofNullable() 方法。当你确定一个对象不可能为 null 的时候,应该使用 of() 方法,否则,尽可能使用 ofNullable() 方法,比如:

public static void method(Role role) {
    // 当Optional的值通过常量获得或者通过关键字 new 初始化,可以直接使用 of() 方法
    Optional<String> strOpt = Optional.of("Hello World");
    Optional<User> userOpt = Optional.of(new User());
 
    // 方法参数中role值不确定是否为null,使用 ofNullable() 方法创建
    Optional<Role> roleOpt = Optional.ofNullable(role);
}

orElse() 方法的使用

return str != null ? str : “Hello World”
上面的代码表示判断字符串 str 是否为空,不为空就返回,否则,返回一个常量。使用 Optional 类可以表示为:

return strOpt.orElse(“Hello World”)
简化 if-else

User user = …
if (user != null) {
String userName = user.getUserName();
if (userName != null) {
return userName.toUpperCase();
} else {
return null;
}
} else {
return null;
}
上面的代码可以简化成:

User user = …
Optional userOpt = Optional.ofNullable(user);

return userOpt.map(User::getUserName)
.map(String::toUpperCase)
.orElse(null);
注意事项
Optional 是一个 final 类,未实现任何接口,Optional 不能序列化,不能作为类的字段(field),所以当我们在利用该类包装定义类的属性的时候,如果我们定义的类有序列化的需求,那么因为 Optional 没有实现 Serializable 接口,这个时候执行序列化操作就会有问题:

import java.util.Optional;
import lombok.Data;

@Data
public class User implements Serializable {
private String name;
private String gender;
private Optional phone; // 不能序列化
}
可以通过自己实现 getter 方法,使 Lomok 不自动生成,如下:

import java.util.Optional;
import lombok.Data

@Data
public class User implements Serializable {
private String name;
private String gender;
private String phone;
public Optional getPhone() {
return Optional.ofNullable(phone);
}
}
总结
Java 8 中 Optional 类可以让我们以函数式编程的方式处理 null 值,抛弃了 Java 8 之前需要嵌套大量 if-else 代码块,使代码可读性有了很大的提高,但是应尽量避免使用 Optional 类型声明实体类的属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Zero-reference deep curve estimation for low-light image enhancement代码(简称“ZR-DC”代码)是一项用于低光图像增强的计算机视觉技术。它是一种基于图像曲线估计的方法,通过在零参考条件下学习图像曲线,在不使用其他图像参考的情况下实现低光图像增强。这项技术是一种“无参考”方法,意味着它不需要额外的输入,而是直接从输入的低光图像学习并生成增强后的图像。 具体来说,ZR-DC代码通过使用学习的图像曲线来计算图像的对数域,并将其映射回原始像素空间进行增强。在训练,ZR-DC代码通过使用大量的低光图像和它们对应的增强图像进行训练。最终生成的模型可以用于增强各种低光图像,包括低对比度、暗影和失真等。 该代码是基于深度学习框架PyTorch实现的,包括网络的训练和测试代码。它还提供了一些实用工具,如数据加载器、图像可视化和性能评估工具。该代码已在多个数据集上进行了测试,包括LOL、SID和NPE等,结果表明,它比其他最先进的技术具有更好的性能。此外,该代码还可以应用于实际场景的图像增强和视频增强等。 总之,ZR-DC代码是一种基于图像曲线估计的低光图像增强方法,它使用深度学习技术从零参考条件下学习图像曲线,并可生成高质量的增强图像。该代码具有良好的可扩展性和实用性,可以应用于多种场景下的低光图像增强问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着希望活下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值