Guava基本工具包Base:Null和字符串分割(Splitter)、拼接(Joiner)处理

简介: Guava基本工具包Base:Null和字符串分割(Splitter)、拼接(Joiner)处理

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。


本文使用的Guava版本如下:

<!--guava-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>25.1-jre</version>
</dependency>


图片.png


Object.equals

       当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查。使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException。例如:

 /**
     * @param
     * @return void
     * @Title:
     * @methodName: ObjectsTest
     * @Description:
     * @author: FLY
     * @date: 2018-06-23 7:36
     */
    public static void ObjectsTest() {
        System.out.println(Objects.equal("a", "a")); // returns true
        System.out.println(Objects.equal(null, "a")); // returns false
        System.out.println(Objects.equal("a", null)); // returns false
        System.out.println(Objects.equal(null, null)); // returns true
    }


Optional

       Guava的Optional类似于Java 8新增的Optional类,都是用来处理null的。

       Guava用Optional表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但Optional从不会包含null值引用。

 /**
     * @param
     * @return void
     * @Title:
     * @methodName: OptionalTest
     * @Description:
     * @author: FLY
     * @date: 2018-06-23 7:44
     */
    public static void OptionalTest() {
        Integer value1 = null;
        Integer value2 = 10;
        /**
         * 创建指定引用的Optional实例,若引用为null则表示缺失
         */
        Optional<Integer> a = Optional.fromNullable(value1);
        Optional<Integer> c = Optional.fromNullable(value2);
        /**
         * 创建指定引用的Optional实例,若引用为null则快速失败
         */
        // Optional<Integer> b = Optional.of(value1); // java.lang.NullPointerException
        Optional<Integer> d = Optional.of(value2);
        //isPresent():如果Optional包含非null的引用(引用存在),返回true
        System.out.println("a: " + a.isPresent()); // a: false
        System.out.println("c: " + c.isPresent()); // c: true
        System.out.println("d: " + d.isPresent());// d: true
        Integer value3 = a.or(0);  //返回Optional所包含的引用,若引用缺失,返回指定的值
        Integer value4 = d.get(); //返回所包含的实例,它必须存在,通常在调用该方法时会调用isPresent()判断是否为null
        Integer value5 = value3 + value4;
        System.out.println(value5); // 10
    }


Preconditions


       前置条件Preconditions提供静态方法来检查方法或构造函数,被调用是否给定适当的参数。它检查的先决条件。其方法失败抛出IllegalArgumentException。

/**
     * @Title:
     * @methodName: sumPreconditions
     * @param a
     * @param b
     * @return int
     * @Description:
     *
     * @author: FLY
     * @date: 2018-06-26 6:39
     */
    public static int sumPreconditions(Integer a,Integer b){
        a=Preconditions.checkNotNull(a,
                "Illegal Argument passed: First parameter is Null.");
        b=Preconditions.checkNotNull(b,
                "Illegal Argument passed: First parameter is Null.");
        return a+b;
    }
public static void main(String[] args) {
        try {
            sumPreconditions(4,null);
        } catch (NullPointerException e){
            System.out.println("【异常了】"+ e.getMessage());
 //  【异常了】Illegal Argument passed: First parameter is Null.
        }
    }

连接器[Joiner]

       用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有null,那连接操作会更难。Fluent风格的Joiner让连接字符串更简单。


/**
     * @param
     * @return void
     * @Title: 连接器[Joiner]
     * @methodName: JoinerTest
     * @Description:
     * @author: FLY
     * @date: 2018-06-23 7:44
     */
    public static void JoinerTest() {
        /*
         on:制定拼接符号,如:test1-test2-test3 中的 “-“ 符号
         skipNulls():忽略NULL,返回一个新的Joiner实例
         useForNull(“Hello”):NULL的地方都用字符串”Hello”来代替
        */
        StringBuilder sb = new StringBuilder();
        Joiner.on(",").skipNulls().appendTo(sb, "Hello", "Guava");
        System.out.println("【on:制定拼接符号】:" + sb); // 【on:制定拼接符号】:Hello,Guava
        System.out.println(Joiner.on(",").useForNull("none").join(1, null, 3));// 1,none,3
        System.out.println(Joiner.on(",").skipNulls().join(Arrays.asList(1, 2, 3, 4, null, 6)));// 1,2,3,4,6
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        System.out.println(Joiner.on("&").withKeyValueSeparator("=").join(map)); // key1=value1&key2=value2&key3=value3
    }

拆分器[Splitter]

       JDK内建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丢弃了尾部的分隔符。 问题:”,a,,b,”.split(“,”)返回?

/**
     * @param
     * @return void
     * @Title: 拆分器[Splitter]
     * @methodName: SplitterTest
     * @Description:
     * @author: FLY
     * @date: 2018-06-25 6:00
     */
    public static void SplitterTest() {
        // JDK内建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丢弃了尾部的分隔符
        String[] split = ",a,,b,".split(",");
        System.out.println(Arrays.toString(split)); // [, a, , b]
        Iterable<String> splitter = Splitter.on(',')
                .trimResults()
                .omitEmptyStrings()
                .split("the ,quick, , brown         , fox,              jumps, over, the, lazy, little dog.");
        System.out.println(splitter);// [the, quick, brown, fox, jumps, over, the, lazy, little dog.]
    }

拆分器工厂

方法 描述 范例
Splitter.on(char) 按单个字符拆分 Splitter.on(‘;’)
Splitter.on(CharMatcher) 按字符匹配器拆分 Splitter.on(CharMatcher.BREAKING_WHITESPACE)
Splitter.on(String) 按字符串拆分 Splitter.on(“,   “)
Splitter.on(Pattern)Splitter.onPattern(String) 按正则表达式拆分 Splitter.onPattern(“\r?\n”)
Splitter.fixedLength(int) 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 Splitter.fixedLength(3)

拆分器修饰符

方法 描述
omitEmptyStrings() 从结果中自动忽略空字符串
trimResults() 移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int) 限制拆分出的字符串数量

   

  如果你想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法。 警告:splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例。这使得splitter实例都是线程安全的,你可以将其定义为static final常量。




参考来源:http://ifeve.com/google-guava-using-and-avoiding-null/

参考来源:http://ifeve.com/google-guava-strings/

参考来源:https://www.yiibai.com/guava/guava_collections_utilities.html



目录
相关文章
|
JSON 数据格式
JSON - JSON.toJSONString 格式化成 JSON 字符串时保留 null 属性
JSON - JSON.toJSONString 格式化成 JSON 字符串时保留 null 属性
1287 0
|
3月前
|
Java 测试技术
Java系列之判断字符串是为空或者null
这篇文章介绍了如何在Java中使用`isEmpty()`方法判断字符串是否为空或`null`,并提供了相应的测试用例来演示其用法。
|
3月前
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + &quot;BLACK&quot;`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
|
C# 索引
C#基础⑨——字符串(string str = null 与string str = ““的区别)
字符串数组变字符串(字符串数组变新的字符串数组)
|
Oracle 关系型数据库 MySQL
字符串判空 isnotempty & isnotblack/NULL 和空串的区别
业务中经常会有判空处理,一次忘记判空就应该一次祭天。
85 0
|
JSON Java fastjson
SpringBoot业务开发 04、Springboot统一处理null为空字符串
SpringBoot业务开发 04、Springboot统一处理null为空字符串
SpringBoot业务开发 04、Springboot统一处理null为空字符串
|
Android开发
Android 踩坑记录,用.split()方法分割字符串返回null
Android 踩坑记录,用.split()方法分割字符串返回null
|
缓存 Java
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符