当前位置:网站首页>项目中字符串判空总结
项目中字符串判空总结
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("没有查询的相关数据"));
边栏推荐
- How to view the state-owned enterprises have unloaded Microsoft office and switched to Kingsoft WPS?
- NPDP能给产品经理带来什么价值?你都知道了吗?
- Ensure production safety! Guangzhou requires hazardous chemical enterprises to "not produce in an unsafe way, and keep constant communication"
- 博文推荐 | 深入研究 Pulsar 中的消息分块
- 643. Maximum average number of subarrays I
- 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
- [leetcode 324] swing sorting II thinking + sorting
- The data in the database table recursively forms a closed-loop data. How can we get these data
- C learning notes (5) class and inheritance
- Microservice development steps (Nacos)
猜你喜欢
竣达技术丨室内空气环境监测终端 pm2.5、温湿度TVOC等多参数监测
Written on the first day after Doris graduated
111. Minimum depth of binary tree
JVM performance tuning and practical basic theory part II
[14. Interval sum (discretization)]
idea中新建的XML文件变成普通文件的解决方法.
博文推荐 | 深入研究 Pulsar 中的消息分块
The first technology podcast month will be broadcast soon
[Verilog quick start of Niuke series] ~ multi function data processor, calculate the difference between two numbers, use generate... For statement to simplify the code, and use sub modules to realize
Details of appium key knowledge
随机推荐
关于重载运算符的再整理
NPDP产品经理国际认证报名有什么要求?
数据湖系列之一 | 你一定爱读的极简数据平台史,从数据仓库、数据湖到湖仓一体
QT capture interface is displayed as picture or label
手把手带你入门 API 开发
Configuration of ZABBIX API and PHP
Is it reasonable and safe for securities companies to open accounts for 10000 free securities? How to say
博文推荐 | 深入研究 Pulsar 中的消息分块
适合没口才的人做,加入中视频伙伴计划收益是真香,一个视频拿3份收益
tensorflow2-savedmodel convert to pb(frozen_graph)
NPDP能给产品经理带来什么价值?你都知道了吗?
Official announcement: Apache Doris graduated successfully and became the top project of ASF!
Opencv interpolation mode
30 Devops interview questions and answers
Error-tf.function-decorated function tried to create variables on non-first call
About the use of HTTP cache validation last modified and Etag
After twists and turns, I finally found the method of SRC vulnerability mining [recommended collection]
Chapter 4 of getting started with MySQL: creation, modification and deletion of data tables
openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题
643. Maximum average number of subarrays I