一、之前对NULL的处理
@Test
public void test1(){
String userName = null;
if(userName != null){
//对应处理
}else{
//对应处理
}
}
//多级的Null值判断-通常方式
@Test
public void test2(){
TbUser user = userMapper.getbyName("张三");
if(user == null)
//对应处理
else
//对应处理
Address address = user.getAddress();
if(address == null )
//对应处理
else
//对应处理
String homeAddr = address.getHomeAddr();
}
//多级Null值判断-Optional方法
@Test
public void test2(){
TbUser user = userMapper.getbyName("张三");
Optional<String> = Optional.ofNullable(userMapper.getByName("张三"))
.map(User::getAddress)
.map(Adderss::getHomeAddr)
.orElseThrow(()->new RunTimeException("查询地址失败 --> 中间过程出现Null值"));
}
二、Optional类
Optional 是 Java 8 引入的一个类,用于解决空指针异常(NullPointerException)的问题。它的设计目的是为了提供一种更好的方式来处理可能为空的对象。
在传统的 Java 编程中,如果一个方法可能返回 `null`,那么调用该方法后就需要进行空值检查,以免引发空指针异常。这样的代码通常会显得冗长并且容易出错。
使用 `Optional` 可以改善这个问题。`Optional` 可以将可能为空的对象包装起来并提供一系列的操作方法,这些方法可以用来处理包装对象为空的情况,避免直接操作空引用导致的异常。
下面是一些使用 `Optional` 的常见场景和好处:
1. 避免空指针异常:通过将可能为空的对象包装在 `Optional` 中,可以避免直接操作 null 对象而导致的空指针异常。
2. 明确标识可能为空的返回值:某些方法可能返回一个空值,使用 `Optional` 作为方法返回类型可以清晰地表明这一点。
3. 减少空值检查和条件判断:使用 `Optional` 提供的方法可以简化对包装对象是否为空的判断,减少冗长的空值检查代码。
4. 支持流式操作:`Optional` 提供了一些便利的方法,可以在不引发空指针异常的情况下对包装对象进行流式操作,例如 `map`、`filter`、`orElse` 等。
总而言之,`Optional` 提供了一种更加优雅和安全的方式来处理可能为空的对象,避免了空指针异常,并且可以简化代码逻辑。然而,需要注意的是,在使用 `Optional` 时要谨慎选择合适的场景,并避免过度使用,以免增加代码复杂性。
三、Optional的基本使用
1.Optional对象的创建方式
/*
Optional对象的创建方式
*/
@Test
public void test02(){
//1.通过of方法.of方法是不支持null的
Option<String> op1 = Optional.of("zhangsan");
Option<Object> op2 = Optional.of(null); //此时会报空指针
//2.通过 ofNullable方法 支持null
Optional<String> op3 = Optional.ofNullable("lisi");
Option<Object> op4 = Optional.ofNullable(null) //此时不会报异常
//3.通过empty方法直接创建一个空的Optional对象
Optional<Object> op5 = Optional.empty();
}
2.Optional的常用方法
(1).get( )与isPresent( )方法
/*
get():如果Optional有返回值则返回,否则抛出NoSuchElementException异常
get()方法通常和isPresent()方法一块使用
isPresent():判断是否包含值,如果包含值就返回true,如果不包含值就返回false
*/
@Test
public void testGet(){
Optinal<String> op1 = Optional.of("zhangsan");
Optional<String> op2 = Optional.empty();
//获取Optional中的值
if(op1.isPresent())
System.out.println("用户名称" + op1.get());
//获取Optional中的值
if(op2.isPresent())
System.out.println("用户名称" + op2.get());
else
System.out.println("这是一个空Optional对象" );
}
(2) orElse(T t) 、orElseGet(Supplier<T ? super> s)、orElseThrow(Supplier<T ? super> s)
/*
orElse(T t):如果调用对象不为null,就返回原本的值,否则返回t
orElseGet(Supplier<T ? super> s) :如果对象不为null,就返回原本的值,否则就会返回Supplier接口中的Lambda表达式的返回值
orElseThrow(Supplier<T ? super> s)::如果对象不为null,就返回原本的值,否则会抛出异常
*/
@Test
public void test1(){
Optinal<String> op1 = Optional.of("zhangsan");
Optional<String> op2 = Optional.empty();
//orElse()
String name1 = op1.orElse("lisi"); // -->zhangsan
String name2 = op2.orElse("wangwu"); // --> wangwu
//orElseGet(Supplier<T ? super> s)
String name3 = op2.orElseGet(()-> "hello"); // --> Hello
//orElseThrow(Supplier<T ? super> s)
String name4 = op2.orElseThrow(()->new RunTimeException("值不允许为Null"));
}
(3) ifPresent(Consumer c)
/*
ifPresent(Consumer c)如果有值就做什么,参数是一个Consumer接口
*/
@Test
public void test4(){
Optional<String> op1 = Optional.of("zhangsan");
Optional<String> op2 = Optional.empty();
op1.ifPresent(ss -> System.out.println("获取到值"+ss));
}
(4)map()
/*
map()类似于与Stream流中的map(), 用map 将Optional中判断的对象替换成下级对象,如果在此过程中出现NUll 则判断为null。
*/
@Test
public void test1(){
Optional<String> = Optional.ofNullable(new Person("zhangsan",13))
.map(Person::getName)
.orElse("查无此人")
}
@Test
public void test1(){
Optional<String> = Optional.ofNullable(new Person("zhangsan",13))
.map(Person::getName)
.map(String::toUppercase)
.orElse("查无此人")
}
以上是对Optional的浅谈 后续还会补充深入