首页 > 编程语言 >Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验

Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验

时间:2022-11-04 10:25:58浏览次数:73  
标签:非空 Java Preconditions User new null Optional user

场景

Guava

Guava 项目是 Google 公司开源的 Java 核心库,它主要是包含一些在 Java 开发中经常使用到的功能,

如数据校验、不可变集合、计数集合,集合增强操作、I/O、缓存、字符串操作等。

并且 Guava 广泛用于 Google 内部的 Java 项目中,也被其他公司广泛使用,甚至在新版 JDK 中直接引入了 Guava 中的优秀类库

Guava Github:

https://github.com/google/guava

官方用户手册:

https://github.com/google/guava/wiki

依赖引入

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.0-jre</version>
        </dependency>

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

数据校验

数据校验一个是非空校验,一个是预期值判断。

非空判断,就是常说的NullPointException,处理方式一般是if(x==null)的判断进行解决。

预期值判断就是检查数据值是不是自己想要的结果。

Optional

在JDK8以后参考Guava加入了Optional的API,使用上与Guava区别不大。

一个常见的例子就是对象的嵌套判空。

        Company company = new Company("霸道的程序猿",null);
        User user = new User("张三",50,company);
        //之前if嵌套的写法
        if(null!=user){
            User user1 = user;
            if(null!=user1.getCompany()){
                Company company1 = user1.getCompany();
                if(null!=company1.getAddress()){
                    String address = company1.getAddress();
                    System.out.println(address);
                }else{
                    System.out.println("张三公司地址为空");
                }
            }
        }

但是在使用Optional之后可以这样写

        //使用optional之后
        String address = Optional.ofNullable(user)
                .map(User::getCompany)
                .map(Company::getAddress)
                .orElse("默认地址");
        System.out.println(address);

注:

ofNullable:如果user为空,则返回一个单例空Optional对象,如果非空则返回一个Optional包装对象。

map:如果为空,继续返回第一步中的单例Optional对象,否则调用User的getCompany方法。

orElse:获取map中的value,不为空直接返回,为空则将参数作为默认值。

关于Optional的map等api的用法具体可参考如下

Java8新特性-Stream对集合进行操作的常用API:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657

获取Optional对象的方法

1、获取一个空的Optional对象,里面没有值。

Optional<User> optional = Optional.empty();

2、获取一个值非空的Optional对象,如果参数为空则报NullPointException

Optional<User> optional1 = Optional.of(new User());

3、返回一个可以为空也可以非空的Optional对象,如果参数为空则通过Optional.empty返回一个Optional对象。

Optional<User> optional2 = Optional.ofNullable(null);

Optional的常用方法

1、isPresent方法表示判断Optional对象中是否存储的为空值,如果存储为空值那么返回false,否则返回true。

        User user = new User();
        Optional<User> optionalUser= Optional.of(user);
        System.out.println("user是否为空:"+optionalUser.isPresent());//返回true

        User user1 = new User("霸道的程序猿",50,new Company());
        Optional<User> optionalUser1= Optional.of(user1);
        System.out.println("user1是否为空:"+optionalUser1.isPresent());//返回true

        User user2 = null;
        Optional<User> optionalUser2= Optional.ofNullable(user2);
        System.out.println("user1是否为空:"+optionalUser2.isPresent());//返回false

2、get方法返回Optional的引用,若引用缺失则抛出illegalStateException

        Optional<Integer> optionalInteger = Optional.of(5);
        System.out.println(optionalInteger.get());//返回5

3、ifPresent方法,如果optional对象保存的值不是null,则调用参数并执行操作,否则不执行

        User user3 = new User("张三", 20, new Company());
        Optional<User> optionalUser3 = Optional.of(user3);
        optionalUser3.ifPresent(u -> System.out.println(u.getName()));//执行
        Optional<User> optionalUser4 = Optional.ofNullable(null);
        optionalUser4.ifPresent(u -> System.out.println(u.getName()));//不执行

4、orElse()方法中如果optional中存储的值不是null则返回这个值,如果是null则返回传入的值

        User user4 = optionalUser4.orElse(new User("默认",50,new Company()));
        System.out.println(user4.getName());//返回默认
        optionalUser3.orElse(new User("默认",50,new Company()));
        System.out.println(user3.getName());//返回张三

Preconditions

Guava在Preconditions类中提供了若干前置条件判断的实用方法。

比如在如下方法参数校验时

    private void testPreconditions(User user, String param,Boolean ifAllow){
        if(!ifAllow){
            throw new IllegalArgumentException("不被允许");
        }
        if(param ==null){
            throw new NullPointerException("param为空");
        }
        if(user!=null && user.getAge() == 0){
            throw new IllegalArgumentException("user.getAge() == 0");
        }
    }

通过使用Preconditions,期望能尽早抛出异常,而不是等数据被层层传递,传递到非常深的位置,

这样浪费系统资源更不利于我们开发定位错误。所以推荐在方法的入口或运算开始前,先检查数据。

所以上面的校验可以用Preconditions修改为

    private void testPreconditions2(User user, String param,Boolean ifAllow){
        //Preconditions.checkArgument(ifAllow,"不被允许");
        Preconditions.checkArgument(user.getAge()!=0,"user.getAge() == 0");
        //Preconditions.checkNotNull(param,"param为空");
    }

Preconditions的常用方法

 

 

方法使用示例代码

    private void testPreconditions2(User user, String param,Boolean ifAllow){
        //Preconditions.checkArgument(ifAllow,"不被允许");
        Preconditions.checkArgument(user.getAge()!=0,"user.getAge() == 0");
        //Preconditions.checkNotNull(param,"param为空");
    }

    private void testPreconditions3(int index){
        int[] array = {1,2,3,4,5};
        Preconditions.checkElementIndex(index,array.length,"数组越界");
    }

    private void testPreconditions4(int index){
        int[] array = {1,2,3,4,5};
        Preconditions.checkPositionIndex(index,array.length,"数组越界");
    }

    private void testPreconditions5(User user){
        Preconditions.checkState(user.getAge()!=0,"user.getAge()=0");
    }

    @Test
    public void test3(){
        //testPreconditions(new User("zhangsan",0,new Company()),null,false);
        //testPreconditions2(new User("zhangsan",0,new Company()),null,false);
        //testPreconditions3(0);//通过
        //testPreconditions3(5);//不通过
        //testPreconditions4(0);//通过
        //testPreconditions4(5);//通过
        //testPreconditions4(6);//不通过
        testPreconditions5(new User("zhangsan",0,new Company()));//不通过
    }

 

标签:非空,Java,Preconditions,User,new,null,Optional,user
From: https://www.cnblogs.com/badaoliumangqizhi/p/16856791.html

相关文章

  • JavaScript异或运算
    相关性质任何数和自己做异或运算,结果为0,即a⊕a=0a⊕a=0。任何数和0做异或运算,结果还是自己,即a⊕0=⊕a⊕0=⊕。异或运算中,满足交换律和结合律,也就是a⊕b⊕a=b⊕a⊕......
  • Java(screw)生成数据库表结构
    数据库支持MySQLMariaDBTIDBOracleSqlServerPostgreSQLCacheDB(2016)文档生成支持htmlwordmarkdown方式一:代码生成<dependency><groupId>cn......
  • java.lang.StackOverflowError错误的解决方法
    对于java.lang.StackOverflowError认识如下图所示,报出来这种错误的话,很大概率是有以下几种原因:现在来看一看我的报错界面:不难看出,这是无限循环的那种情况,所以,我就去看......
  • Java四舍五入的常见方法(DecimalFormat 用法详解)
    对Java中DecimalFormat的所有基础用法进行了一个汇总。DecimalFormat类主要靠#和0两种占位符号来指定数字长度。0表示如果位数不足则以0填充,#表示只要有可能就......
  • Java函数式编程(1):Lambda表达式(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从之前的Lambda表达式的演变过程可以知道,Lambda表达式其实是一个对匿名内部类的简化过程:去掉了多余的语法修饰,只保留最......
  • javascript Swap two nodes调换两个元素的位置
    SwaptwonodesThefunctionbelowswapstwogivennodes,nodeAandnodeB:constswap=function(nodeA,nodeB){constparentA=nodeA.parentNode;c......
  • java分页查询后端代码
    packagecom.example.demo;importjava.util.List;importorg.apache.ibatis.annotations.Delete;importorg.apache.ibatis.annotations.Insert;importorg.apache.......
  • java操作文件
    三种方式publicFile(Stringpathname)--通过指定的路径名字符串创建一个File对象。--若pathname指向的是文件,创建的File对象就表示文件;--若pathname指向的是目录......
  • leetcode java 杨辉三角
    简介杨辉三角是一道简单题,可以通过类似一层推下一层的方式进行计算,但是好像看过一个题解,采用的方式是组合数。本来想采用组合数,尝试了double溢出尝试了long溢出,尝试......
  • 发起HTTP请求方式汇总(Java)
    Java发起HTTP请求方式汇总Java发起HTTP请求方式汇总2021-01-07T16:31:40+08:00作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了;一般怎......