当前位置:网站首页>项目中字符串判空总结
项目中字符串判空总结
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("没有查询的相关数据"));
边栏推荐
- Solid basic structure and array, private / public function, return value and modifier of function, event
- 643. Maximum average number of subarrays I
- 竣达技术丨多台精密空调微信云监控方案
- [leetcode 324] swing sorting II thinking + sorting
- Buuctf reinforcement question ezsql
- tensorflow2-savedmodel convert to pb(frozen_graph)
- 三十之前一定要明白的职场潜规则
- Storage form of in-depth analysis data in memory
- Basic operations of SQL database
- MongoDB第二话 -- MongoDB高可用集群实现
猜你喜欢

C 语言基础

C#学习笔记(5)类和继承

The markdown editor uses basic syntax

【15. 区间合并】

Internet hospital system source code hospital applet source code smart hospital source code online consultation system source code
![[dynamic programming] p1004 grid access (four-dimensional DP template question)](/img/3a/3b82a4d9dcc25a3c9bf26b6089022f.jpg)
[dynamic programming] p1004 grid access (four-dimensional DP template question)

C learning notes (5) class and inheritance

Official announcement: Apache Doris graduated successfully and became the top project of ASF!

MIT团队使用图神经网络,加速无定形聚合物电解质筛选,促进下一代锂电池技术开发

Buuctf reinforcement question ezsql
随机推荐
Research Report on the development trend and competitive strategy of the global diamond suspension industry
What are the books that have greatly improved the thinking and ability of programming?
Quelle valeur le pdnp peut - il apporter aux gestionnaires de produits? Vous savez tout?
30 Devops interview questions and answers
[zero basic IOT pwn] reproduce Netgear wnap320 rce
[Verilog quick start of Niuke question series] ~ use functions to realize data size conversion
241. Design priorities for operational expressions
tensorflow2-savedmodel convert to pb(frozen_graph)
Internet hospital system source code hospital applet source code smart hospital source code online consultation system source code
The State Administration of Chia Tai market supervision, the national development and Reform Commission and the China Securities Regulatory Commission jointly reminded and warned some iron ores
Guess lantern riddles, not programmers still can't understand?
What is the relationship between network speed, broadband, bandwidth and traffic?
Sqlachemy common operations
MIT团队使用图神经网络,加速无定形聚合物电解质筛选,促进下一代锂电池技术开发
Today, with the popularity of micro services, how does service mesh exist?
[getting started with Django] 13 page Association MySQL "multi" field table (check)
Opencv interpolation mode
首届技术播客月开播在即
Ensure production safety! Guangzhou requires hazardous chemical enterprises to "not produce in an unsafe way, and keep constant communication"
Minimum spanning tree and bipartite graph in graph theory (acwing template)