当前位置:网站首页>项目中字符串判空总结
项目中字符串判空总结
2022-07-01 14:53:00 【小曲同学呀】
在项目中,相信已经有不少的伙伴们已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止空指针异常,是程序员的基本修养。”但是修养归修养,也是我们程序员最令人头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性
Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常)。
项目中字符串判空总结
- 1、认识Optional并使用
- 1.1、Optional对象创建
- 1.2 、Optional.get()方法(返回对象的值)
- 1.3、Optional.isPresent()方法(判读是否为空)
- 1.4、Optional.ifPresent()方法(判读是否为空并返回函数)
- 1.5、Optional.filter()方法(过滤对象)
- 1.6、Optional.map()方法(对象进行二次包装)
- 1.7、Optional.flatMap()方法(Optional对象进行二次包装)
- 1.8、Optional.orElse()方法(为空返回对象)
- 1.9、Optional.orElseGet()方法(为空返回Supplier对象)
- 1.10、Optional.orElseThrow()方法(为空返回异常)
1、认识Optional并使用
简单来说,java提供的Opitonal类就是Java提供的为了解决大家平时判断对象是否为空, 会用 null!=obj 这样的方式存在的判断,从而解决令人头疼导致NPE(Null Pointer Exception 空指针异常),同时Optional的存在可以让代码更加简单,可读性更高,代码写起来更高效。
常规判断:
//对象 人
//属性有 name,age
Person person=new Person();
if (null==person){
return "person为null";
}
return person;
使用Optional:
//对象 人
//属性有 name,age
Person person=new Person();
return Optional.ofNullable(person).orElse("person为null");
测试展示类Person代码(如果有朋友不明白可以看一下这个):
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.1、Optional对象创建
首先我们先打开Optional的内部,去一探究竟 先把几个创建Optional对象的方法提取出来。
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
//我们可以看到两个构造方格都是private 私有的
//说明 我们没办法在外面去new出来Optional对象
private Optional() {
this.value = null;
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
//这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
//这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
//这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
}
再做一个简单的实例展示 与上面对应
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optEmpty = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optOf = Optional.of("optional");
// 3、创建包装对象值允许为空也可以不为空的Optional对象
Optional<String> optOfNullable1 = Optional.ofNullable(null);
Optional<String> optOfNullable2 = Optional.ofNullable("optional");
1.2 、Optional.get()方法(返回对象的值)
get()方法是返回一个option的实例值 源码:
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
也就是如果value不为空则做返回,如果为空则抛出异常 “No value present” 简单实例展示:
Person person=new Person();
person.setAge(2);
Optional.ofNullable(person).get();
1.3、Optional.isPresent()方法(判读是否为空)
isPresent()方法就是会返回一个boolean类型值,如果对象不为空则为真,如果为空则false 源码:
public Boolean isPresent() {
return value != null;
}
简单的实例展示:
Person person=new Person();
person.setAge(2);
if (Optional.ofNullable(person).isPresent()){
//写不为空的逻辑
System.out.println("不为空");
} else{
//写为空的逻辑
System.out.println("为空");
}
1.4、Optional.ifPresent()方法(判读是否为空并返回函数)
这个意思是如果对象非空,则运行函数体 源码:
public void ifPresent(Consumer<? super T> consumer) {
//如果value不为空,则运行accept方法体
if (value != null)
consumer.accept(value);
}
看实例:
Person person=new Person();
person.setAge(2);
Optional.ofNullable(person).ifPresent(p -> System.out.println("年龄"+p.getAge()));
如果对象不为空,则会打印这个年龄,因为内部已经做了NPE(非空判断),所以就不用担心空指针异常了。
1.5、Optional.filter()方法(过滤对象)
filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional。
源码:
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
//如果为空直接返回this
if (!isPresent())
return this; else
//判断返回本身还是空Optional
return predicate.test(value) ? this : empty();
}
简单示例:
Person person=new Person();
person.setAge(2);
Optional.ofNullable(person).filter(p -> p.getAge()>50);
1.6、Optional.map()方法(对象进行二次包装)
map()方法将对应Funcation函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
源码:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
//如果为空返回自己
if (!isPresent())
return empty();
else {
//否则返回用方法修饰过的Optional
return Optional.ofNullable(mapper.apply(value));
}
}
示例展示:
Person person1=new Person();
person.setAge(2);
String optName = Optional.ofNullable(person).map(p -> person.getName()).orElse("name为空");
1.7、Optional.flatMap()方法(Optional对象进行二次包装)
map()方法将对应Optional< Funcation >函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
源码:
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty(); else {
return Objects.requireNonNull(mapper.apply(value));
}
}
示例
Person person=new Person();
person.setAge(2);
Optional<Object> optName = Optional.ofNullable(person).map(p -> Optional.ofNullable(p.getName()).orElse("name为空"));
1.8、Optional.orElse()方法(为空返回对象)
常用方法之一,这个方法意思是如果包装对象为空的话,就执行orElse方法里的value,如果非空,则返回写入对象
源码:
public T orElse(T other) {
//如果非空,返回value,如果为空,返回other
return value != null ? value : other;
}
1.9、Optional.orElseGet()方法(为空返回Supplier对象)
这个与orElse很相似,入参不一样,入参为Supplier对象,为空返回传入对象的.get()方法,如果非空则返回当前对象
源码:
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
示例:
Optional<Supplier<Person>> sup=Optional.ofNullable(Person::new);
//调用get()方法,此时才会调用对象的构造方法,即获得到真正对象
Optional.ofNullable(person).orElseGet(sup.get());
1.10、Optional.orElseThrow()方法(为空返回异常)
这个我个人在实战中也经常用到这个方法,方法作用的话就是如果为空,就抛出你定义的异常,如果不为空返回当前对象,在实战中所有异常肯定是要处理好的,为了代码的可读性
源码:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
实例:这个就贴实战源码了
//简单的一个查询
Member member = memberService.selectByPhone(request.getPhone());
Optional.ofNullable(member).orElseThrow(() -> new ServiceException("没有查询的相关数据"));
边栏推荐
- 深度分析数据在内存中的存储形式
- It's suitable for people who don't have eloquence. The benefits of joining the China Video partner program are really delicious. One video gets 3 benefits
- What problems should be considered for outdoor LED display?
- 博文推荐 | 深入研究 Pulsar 中的消息分块
- 这3款在线PS工具,得试试
- tensorflow2-savedmodel convert to pb(frozen_graph)
- 使用net core 6 c# 的 NPOI 包,读取excel..xlsx单元格内的图片,并存储到指定服务器
- What is the relationship between network speed, broadband, bandwidth and traffic?
- Salesforce, Johns Hopkins, Columbia | progen2: exploring the boundaries of protein language models
- En utilisant le paquet npoi de net Core 6 c #, lisez Excel.. Image dans la cellule xlsx et stockée sur le serveur spécifié
猜你喜欢

sqlilabs less10

数据湖系列之一 | 你一定爱读的极简数据平台史,从数据仓库、数据湖到湖仓一体

Fundamentals of C language

Semiconductor foundation of binary realization principle

IDEA全局搜索快捷键(ctrl+shift+F)失效修复

【15. 区间合并】

The data in the database table recursively forms a closed-loop data. How can we get these data

【牛客网刷题系列 之 Verilog快速入门】~ 使用函数实现数据大小端转换

关于重载运算符的再整理

Opencv interpolation mode
随机推荐
网速、宽带、带宽、流量三者之间的关系是什么?
Problem note - Oracle 11g uninstall
Ensure production safety! Guangzhou requires hazardous chemical enterprises to "not produce in an unsafe way, and keep constant communication"
Research Report on the development trend and competitive strategy of the global camera filter bracket industry
tensorflow2-savedmodel convert to tflite
SQLAchemy 常用操作
Salesforce、约翰霍普金斯、哥大 | ProGen2: 探索蛋白语言模型的边界
How to view the state-owned enterprises have unloaded Microsoft office and switched to Kingsoft WPS?
Research Report on development trend and competitive strategy of global vibration polishing machine industry
音乐播放器开发实例(可毕设)
Mongodb second call -- implementation of mongodb high availability cluster
2022-2-15 learning the imitation Niuke project - Section 3 post details
[leetcode 324] 摆动排序 II 思维+排序
Opencv interpolation mode
Buuctf reinforcement question ezsql
MIT团队使用图神经网络,加速无定形聚合物电解质筛选,促进下一代锂电池技术开发
[stage life summary] I gave up the postgraduate entrance examination and participated in the work. I have successfully graduated and just received my graduation certificate yesterday
Pat 1121 damn single (25 points) set
基于价值量化的需求优先级排序方法
Research Report on the development trend and competitive strategy of the global diamond suspension industry