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

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

本文使用的Guava版本如下:



com.google.guava
guava
25.1-jre


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

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 a = Optional.fromNullable(value1);
        Optional c = Optional.fromNullable(value2);
        /**
         * 创建指定引用的Optional实例,若引用为null则快速失败
         */
        // Optional b = Optional.of(value1); // java.lang.NullPointerException
        Optional 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 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 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

你可能感兴趣的:(琦彦の百宝箱,Guava)