Java8 判空新写法(Optional方式)

本文介绍了Java8中的Optional类在处理null值、异常抛出、数据转换和条件操作中的实际应用,展示了如何通过orElse、orElseGet和orElseThrow简化代码并提高可读性。
摘要由CSDN通过智能技术生成

先上实战

     实战案例一

旧写法

public String getCity(User user)  throws Exception{
        if(user!=null){
            if(user.getAddress()!=null){
                Address address = user.getAddress();
                if(address.getCity()!=null){
                    return address.getCity();
                }
            }
        }
        throw new Excpetion("取值错误"); 
    }

 java8

public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("取指错误"));
}
实战案例二

旧写法

if(user!=null){
    dosomething(user);
}

java8

 Optional.ofNullable(user)
    .ifPresent(u->{
        dosomething(u);
});
实战案例三

旧写法

public User getUser(User user) throws Exception{
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}

java8

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        User user1 = new User();
                        user1.setName("zhangsan");
                        return user1;
                   });
}

Optional方法说明

一:Optional(T value),empty(),of(T value),ofNullable(T value)

通过of(T value)函数所构造出的Optional对象,当Value值为空时,依然会报NullPointerException。
通过of(T value)函数所构造出的Optional对象,当Value值不为空时,能正常构造Optional对象。
empty()的作用就是返回EMPTY对象
ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象


案例
//调用工厂方法创建Optional实例
Optional<String> name = Optional.of("java265.com");

//创建一个空实例
Optional empty = Optional.ofNullable(null);

//创建一个不允许值为空的空实例
Optional noEmpty = Optional.of(null);

二:orElse简介、orElseGet简介、orElseThrow简介

orElse简介

//当值不为null,orElse方法返回Optional实例的值
//当为null,返回传入的消息

//输出java265.com
System.out.println(name.orElse("other value!"));

//输出:最爱java
System.out.println(empty.orElse("最爱java"));

//抛NullPointerException 因为of中不允许传入Null
System.out.println(noEmpty.orElse("异常");.


orElseGet简介

orElseGet与orElse方法类似
   1.区别在于得到的默认值

        orElse方法将传入的字符串作为默认值
        orElseGet方法可以接受Supplier的实现用来生成默认值

        public T orElseGet(Supplier<? extends T> other)
       参数:继承Supplier接口的other
            当值为null的时候返回

       返回:
           值存在返回值,值不存在返回other

       异常:
            当不允许值为空的情况(如)下值为空时或other无效抛NullPointerException

   2.当user值不为null时,orElse函数依然会执行createUser()方法,而orElseGet函数并不会执行createUser()方法,大家可自行测试

案例
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:java265.com
System.out.println(name.orElseGet(() -> ``"it's value"``));
//输出:No value
System.out.println(empty.orElseGet(() -> ``"No value"``));
//抛出NullPointerException
System.out.println(noEmpty.orElseGet(() -> ``"it's value"``));


orElseThrow简介
 当Optional有值时,
    则将其返回
 否则抛出Supplier接口创建的异常 

orElseThrow语法说明:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                    throws X extends Throwable
   参数:exceptionSupplier 一个抛异常的实例化Supplier
   返回:当前值或当值为null抛出异常
   异常:当不允许值为空的时候以及exceptionSupplier为空抛NullPointerException;值为空抛Supplier继承的异常

通过上面的对比我们可发现orElse,orElseGet,orElseThrow三者的区别:
   orElse:返回内容
   orElseGet:返回实现了Supplier的内容
   orElseThrow:直接返回异常信息

   

三:map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)
 

这两个函数,在函数体上没什么区别。唯一区别的就是入参,map函数所接受的入参类型为Function<? super T, ? extends U>,而flapMap的入参类型为Function<? super T, Optional>
  
  如果User结构是下面这样的
  

  public class User {
    private String name;
    public String getName() {
        return name;
    }
}

这时候取name的写法如下所示

String city = Optional.ofNullable(user).map(u-> u.getName()).get();

对于flatMap而言:

如果User结构是下面这样的

public class User {
    private String name;
    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }
}

这时候取name的写法如下所示

String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();

四:isPresent()和ifPresent(Consumer<? super T> consumer)


isPresent即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。
filter(Predicate<? super T> predicate)
filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty

用法如下

Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);


如上所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象。


参考的连接:Java8 判空新写法(Optional方式)_optional判断为空-CSDN博客

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值