首页 > 编程语言 >java的可选链Optional

java的可选链Optional

时间:2023-07-05 14:37:07浏览次数:46  
标签:map return 选链 user java null Optional User

Optional是Jdk1.8提供的一个新类,用以解决null判断问题,作用类似于 JavaScript 中的可选链

例如如下场景:

private void getIsoCode(User user){
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            Country country = address.getCountry();
            if (country != null) {
                String isocode = country.getIsocode();
                if (isocode != null) {
                    isocode = isocode.toUpperCase();
                }
            }
        }
    }
    //可简化为
    Optional.ofNullable(user).map(u -> u.getAddress())
                             .map(a -> a.getCountry())
                             .map(c -> c.getIsoCode())
                             .map(c -> c.toUpperCase())
                             .orElse(null)
}

API介绍

Optional的所有的方法如下图所示,这些API大致可以分为以下几类:

1、构建API:构建一个Optional对象;方法有:empty( )、of( )、ofNullable( );

2、获取API:获取Optional对象里包装的值;方法有:get( )、orElse( )、orElseGet( )、orElseThrow( );

3、转换API:将Optional对象里包装的值转换成一个新的值;方法有:map( )、flatMap( );

4、判断API:对Optional对象里包装的值做一些逻辑判断;方法有:filter( )、isPresent( )、ifPresent( );

5. 创建Optional通常使用 Optional.ofNullable, 它能兼容null,进行连续处理

of(T value)的区别就是,当value值为null时,of(T value)会报NullPointerException异常
ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象


使用场景:

1. 仅仅在处理数据时使用,在方法内部处理数据
2. 不要将Optional作为 参数(含义模糊),成员变量(不可序列化)
3. 配合 Java Stream 使用效果最佳

 

以下为Optional<T>的正确使用方式:

//存在即返回, 无则提供默认值
return user.orElse(null);     //而不是 return user.isPresent() ? user.get() : null;

//存在即返回, 无则由函数来产生
return user.orElseGet(() -> getUser()); //而不要 return user.isPresent() ? user: getUser();

//存在才对它做点什么
user.ifPresent(System.out::println);
//而不要下边那样
if (user.isPresent()) {
  System.out.println(user.get());
}

//map处理返回空集合
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())
//上面避免了我们类似 Java 8 之前的做法
if(user.isPresent()) {
  return user.get().getOrders();
} 
else {
  return Collections.emptyList();
}

//map无限级联, 比如再深一层, 获得用户名的大写形式
return user.map(u -> u.getUsername())
           .map(name -> name.toUpperCase())
           .orElse(null);

//filter支持对属性进行过滤
Optional<String> longName = name.filter((value) -> value.length() > 6);  
System.out.println(longName.orElse("The name is less than 6 characters"));


//Stream中使用
User user = users.stream().findFirst().orElse(new User("default", "1234"));

经典使用场景

1. 判断取值,无值抛异常

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("取值错误"); 
}
//可写为
public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("取指错误"));
}

2. 判断取值,无值返回特定值

public User getUser(User user){
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}
//可写为
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;
                   });
}

3. 空值判断

if(user!=null){
    dosomething(user);
}
//可写为
Optional.ofNullable(user).ifPresent(u -> dosomething(u));
     

 

参考:Java8 Optional 的正确使用方式 

         还用 != null 判空?新姿势,值得学习 

标签:map,return,选链,user,java,null,Optional,User
From: https://www.cnblogs.com/mengff/p/17528414.html

相关文章

  • java 中协变,逆变,不变简单理解
    1.什么是协变、逆变、不变假设有两个类,Dog和Animal,如果用Dog<=Animal表示它俩的继承关系。用f(type)表示类型构造器,一个已知的类型被类型构造器处理后就是一个崭新的类型。协变就是f(Dog)是f(Animal)的子类,即f(Dog)<=f(Animal);逆变就是f(Animal)是f(Dog)的子类,即f(Ani......
  • JAVA设计模式之建造者模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 单线程JavaScript为何如此高效
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址什么是js执行机制JavaScript的执行机制指的是JavaScript代码在运行时的工作方式和顺序。它涉及以下几个关键概念:单线程:JavaScript是一门单线程的编程语言,意味着它只有一个主线程用于执行代码。这意味着JavaScrip......
  • java双冒号写法(Lambda的简写)
    类似这种Person::getName,双冒号写法,是Java8对Lambda表达式的简写常见的简写场景有以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方法引用语法:instance::methodname例如:System.out::println对象的超类方......
  • 面向对象(java)
    一、定义 二、注意事项:一个java文件中最好只写一个类;  三、封装(1)对象代表什么,就得封装对应的数据,并提供数据对应的行为;(2)如果加了static,就是类的变量(类共享),而不是实例变量了;......
  • java运行ubuntu clear命令
    importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassClearScreen{publicstaticvoidmain(String[]args){try{//执行clear命令Processprocess=Runtime.getRuntime().exec("clear");......
  • JavaScript发展历史(JS)
    JavaScript发展历史1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,这是世界上第一款比较成熟的网络浏览器,轰动一时。但是这是一款名副其实的浏览器--只能浏览页面,浏览器无法与用户互动,当时解决这个问题有两个办法,一个是采用现有的语言,许他们直接嵌入网页。另一个是发明一......
  • 关于Java已死,看看国外开发者怎么说的
    博主在浏览medium社区时,发现了一篇点赞量1.5k的文章,名称叫《JavaisDead—5MisconceptionsofdevelopersthatstillthinkJavaisrelevanttoday!》直译过来就是《Java已死—开发人员对Java在现代编程语言中的5个误解》。这篇文章可以说是标题党得典范,热度全靠标......
  • javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10
    问题:报错:javax.net.ssl.SSLHandshakeException:TheserverselectedprotocolversionTLS10isnotacceptedbyclientpreferences[TLS12]解决方式:1、修改%JAVA_HOME%/jre/lib/security/java.security2、修改内容:jdk.tls.disabledAlgorithms删除TLSv13、删除前: https:......
  • Java异常分类和常见异常
    1.异常异常:执行中发生的不正常情况。分为两类:Error:JVM系统内部错误、资源耗尽等严重情况。比如StackOverflowError和OutOfMemory。Exception:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界。解决办法:①终止程序运行;②错误检测提示处理。2.异常分类......