zoukankan      html  css  js  c++  java
  • Guava 字符串使用总结

    背景

      目前Google Guava在实际应用中非常广泛,本篇是我对 Guava 使用的认识以及在项目中的经验来给大家分享!

      学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码!

      以面向对象思想处理字符串:Joiner/Splitter/CharMatcher

    问题

      有朋友就要问了,jdk 提供的 String 还不够好吗?

      也许还不够友好,至少让我们用起来还不够爽,还得操心!

      举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。

      guava 使用起来就不需要考虑这么多,好,那我们开始进入正式主题。

    Joiner/Splitter

      Joiner是连接器,Splitter是分割器,通常我们会把它们定义为 static final,利用 on 生成对象后,在应用到 String 进行处理,这是可以复用的。

      要知道 apache commons StringUtils 提供的都是 static method。

      更加重要的是,guava提供的 Joiner/Splitter 是经过充分测试,它的稳定性和效率要比apache高出不少,这个你可以自行测试下~发现没有我们想对String做什么操作,就是生成自己定制化的 Joiner/Splitter,多么直白,简单,流畅的API!

      对于Joiner,常用的方法是 跳过NULL元素:skipNulls() ;

      对于NULL元素使用其他替代:useForNull(String)。

      对于Splitter,常用的方法是:trimResults() / omitEmptyStrings()。

      注意拆分的方式,有字符串,还有正则,还有固定长度分割(太贴心了!)

    Joiner 应用案例

    将集合按指定字符拼接成字符串

    private final List<String> stringList = Arrays.asList(
            "tom","jack","bob");
    
    private final List<String> stringListWithNullValue = Arrays.asList(
            "tom","jack","bob",null,"rose");
    
    @Test
    public void testJoin(){
        String join = Joiner.on("#").join(stringList);
        assertThat(join,equalTo("tom#jack#bob"));
    }
    
    // 跳过list中的null
    @Test
    public void testJoinOnJoinSkipNull(){
        String join = Joiner.on("#").skipNulls().join(stringListWithNullValue);
        assertThat(join,equalTo("tom#jack#bob#rose"));
    }
    
    // 替换null为指定字符
    @Test
    public void testJoinOnJoinUseForNull(){
        String join = Joiner.on("#").useForNull("NULL").join(stringListWithNullValue);
        assertThat(join,equalTo("tom#jack#bob#NULL#rose"));
    }
    
    // appendTo
    @Test
    public void testJoinOnJoinAppendTo(){
        final StringBuilder buffer = new StringBuilder("TEST");
        StringBuilder buffer_new = Joiner.on("#").appendTo(buffer, stringList);
        assertThat(buffer_new.toString(),equalTo("TESTtom#jack#bob"));
    }
    
    private final Map<String,String> stringMap = ImmutableMap.of("a","b","c","d");
    
    /**
     * 对Map kv拆分
     */
    @Test
    public void testJoinOnWithMap(){
        assertThat(Joiner.on("#").withKeyValueSeparator("=").join(stringMap),equalTo("a=b#c=d"));
    }
    Joiner示例

    Splitter 应用案例

    Splitter主要是分隔字符串为List或Map

    @Test
    public void testSplitter(){
        List<String> stringList = Splitter.on("|").splitToList("hello|word");
        assertThat(stringList,notNullValue());
        assertThat(stringList.size(),equalTo(2));
    }
    
    @Test
    public void testSplitter_OmitEmpty(){
        List<String> stringList = Splitter.on("|").omitEmptyStrings().splitToList("hello|word||||");
        assertThat(stringList,notNullValue());
        assertThat(stringList.size(),equalTo(2));
    }
    
    @Test
    public void testSplitter_TrimResult(){
        List<String> stringList = Splitter.on("|").trimResults().omitEmptyStrings().splitToList(" hello | word||||");
        assertThat(stringList,notNullValue());
        assertThat(stringList.size(),equalTo(2));
    }
    
    @Test
    public void testSplitter_FixLeng(){
        List<String> result = Splitter.fixedLength(4).splitToList("aaaabbbbccccdddd");
        assertThat(result,notNullValue());
        assertThat(result.size(),equalTo(4));
        assertThat(result.get(0),equalTo("aaaa"));
    }
    
    @Test
    public void testSplitter_Limit(){
        List<String> result = Splitter.on("#").limit(3).splitToList("aaaa#bbbb#cccc#dddd");
        assertThat(result,notNullValue());
        assertThat(result.size(),equalTo(3));
        assertThat(result.get(2),equalTo("cccc#dddd"));
    }
    
    // 转Map
    @Test
    public void testSplitter_SplitToMap(){
        Map<String, String> split = Splitter.on("|").withKeyValueSeparator("=").split("a=b|c=d");
        assertThat(split,notNullValue());
        assertThat(split.size(),equalTo(2));
        assertThat(split.get("a"),equalTo("b"));
    }
    Splitter示例

    CharMatcher

      CharMatcher,将字符的匹配和处理解耦,并提供丰富的方法供你使用!

      对基本类型进行支持

      guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!那我们直接上代码吧

    //1.判定型函数,判断 CharMacher 和入参字符串的匹配关系。
    System.out.println(CharMatcher.is('a').matchesAllOf("aaa")); //true
    System.out.println(CharMatcher.is('a').matchesAnyOf("aba")); //true
    System.out.println(CharMatcher.is('a').matchesNoneOf("aba"));//false
    //2.计数型函数,查找入参字符串中第一次、最后一次出现目标字符的位置,或者目标字符出现的次数
    System.out.println(CharMatcher.is('a').countIn("aba"));//2
    System.out.println(CharMatcher.is('a').indexIn("aba"));//0
    //3.对匹配字符的操作。包括 removeFrom、retainFrom、replaceFrom、trimFrom、collapseFrom 等
    System.out.println(CharMatcher.is('a').retainFrom("bazaar"));//aaa
    System.out.println(CharMatcher.is('a').removeFrom("bazaar"));//bzr
    System.out.println(CharMatcher.anyOf("ab").removeFrom("abacatbab"));//ct

      还有一些常用的常量使用来处理字符串内容,具体实际案例如下:

    String str = " ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好	234啊   GES ";
    /**
     * 1. 原字符串
     *  ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好   234啊   GES
     */
    System.out.println(str);
    /**
     * 2. 去掉控制字符(	,
    ,...)
     *  ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好234啊   GES
     */
    System.out.println(CharMatcher.javaIsoControl().removeFrom(str));
    /**
     * 3. 获取所有的数字
     * 23234
     */
    System.out.println(CharMatcher.digit().retainFrom(str));
    /**
     * 4. 把多个空格替换为一个包括	,并去掉首位的空格
     * ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES
     */
    System.out.println(CharMatcher.whitespace().trimAndCollapseFrom(str, ' '));
    /**
     * 5. 把所有的数字用"*"代替
     *  ROCKY  rocky  RoCkY ~!@#$%^&*()      **(*&gS   你好   ***啊   GES 
     */
    System.out.println(CharMatcher.javaDigit().replaceFrom(str, "*"));
    /**
     * 6. 获取所有的数字和小写字母
     * rockyok23g234
     */
    System.out.println(CharMatcher.javaDigit().or(CharMatcher.javaLowerCase()).retainFrom(str));
    /**
     * 7. 获取所有的大写字母
     * ROCKYRCYSGES
     */
    System.out.println(CharMatcher.javaUpperCase().retainFrom(str));
    /**
     * 8. 获取所有单字节长度的符号
     * ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS         234   GES 
     */
    System.out.println(CharMatcher.singleWidth().retainFrom(str));
  • 相关阅读:
    《楞严经四种清净明诲》 (转自学佛网:http://www.xuefo.net/nr/article56/559965.html)
    忏悔言情小说带来的意淫以及对治方法 (转自学佛网:http://www.xuefo.net/nr/article55/554935.html)
    一个80后妈妈的邪淫忏悔(转自学佛网:http://www.xuefo.net/nr/article55/551761.html)
    邪淫真正的可怕危害 (转自学佛网:http://www.xuefo.net/nr/article54/544414.html)
    净空法师详解《般若波罗蜜多心经》,转给有缘人
    净空法师主讲:净业三福【全2集】
    《阿含经》的思想
    佛教最早时期的根本经典 《阿含经》为何如此重要?
    弘一法师妙解《心经》
    读唯识三十颂讲话日记 原创: 李美君 那兰陀广场
  • 原文地址:https://www.cnblogs.com/liang1101/p/13638186.html
Copyright © 2011-2022 走看看