美文网首页
java Optional

java Optional

作者: 手打丸子 | 来源:发表于2019-05-13 16:09 被阅读0次

    空指针是一个软件的万恶之源,是程序报错的最高频异常,没有之一;

    这种情况下,java8发布了Optional类,这个和流式操作很像的类,可以让结果为空这种情况处理起来相对简单一些。

    Optional是种容器,你可以把对象放在容器中,至于放进去有啥好处,我们往下看看吧

    这是以前没办法的时候,返回null,并处理null的样例,如果你哪天忘了if...else...情况会一度非常尴尬

    public class OptionalTest {
    
    
        public static User wantAUser(){
            try{
                //every thing is right
                return new User();
            }catch (Exception e){
                //some bad thing happened
                return null;
            }
        }
    
        public static void main(String[] args){
            User user = wantAUser();
            if(null == user){
                user = new User();
            }
           System.out.println(user.getName());
        }
    }
    

    我们看看直接改成Optional咋改:

    public class OptionalTest {
    
    
        public static Optional<User> wantAUser(){
            try{
                //every thing is right
                return Optional.of(new User());
            }catch (Exception e){
                //some bad thing happened
                return Optional.empty();
            }
        }
    
        public static void main(String[] args){
            Optional<User> user = wantAUser();
            if(!user.isPresent()){
                System.out.println(user.get().getName());
            }else {
                System.out.println(new User().getName());
            }
        }
    }
    

    看上去并没有优雅多少,跟用null来判断也差不多;
    其实是没有掌握Optional的正确打开方式
    下面用这种方式试试:

            Optional<User> user = wantAUser();
            System.out.println(user.orElse(new User()).getName());
    

    还有很多好玩的方法:

           //不空则获取,空则返回其他对象
            User user1 = user.orElse(new User());
    
            //不空则获取,空则通过方法返回对象
            User user2 =user.orElseGet(() -> {
                return new User();
            });
    
            //一大串map来处理并获取
            String nameUpper=user.map(u->u.getName())
                    .map(name->name.toUpperCase())
                    .orElse("no name");
    

    这些方法和java8中的流式操作基本属于同一系列
    让你的java代码行云流水
    是不是感觉不错,赶紧用起来吧,干掉代码中那些丑陋的if空指针判断

    相关文章

      网友评论

          本文标题:java Optional

          本文链接:https://www.haomeiwen.com/subject/qpllaqtx.html