Guava系列之强大的String工具类

x33g5p2x  于2021-12-18 转载在 其他  
字(6.1k)|赞(0)|评价(0)|浏览(264)

Guava提供几个好用的String工具类,能很方便的处理字符串,分享给大家

Joiner

Joiner是用来连接字符串的,它能以指定的字符对多个字符串进行连接

比如,我们要将一个List中的元素用逗号连接起来,这是日常开发中很常见的逻辑处理,那以前我们可能会这样写

List<String> list = Lists.newArrayList("a","b","c");
    StringBuffer buffer = new StringBuffer();
    for(int i = 0; i < list.size(); i++){
        if(i > 0){
            buffer.append(",");
        }
        buffer.append(list.get(i));
    }
    System.out.println(buffer.toString());

下面我们看一下Joiner中的写法

String str = Joiner.on(",").join(Lists.newArrayList("a","b","c"));
System.out.println(str);

可以看到,Joiner用一行代码就完成了list中各个元素的拼接,除了这些还可以跳过空元素,还可以连接map中的key和value,下面我们来看一下Joiner的详细用法

@Test
    public void joinerTest(){
        //Join可以连接list、数组中的元素
        String str = Joiner.on(",").join(Lists.newArrayList("a","b","c"));
        String str1 = Joiner.on("#").join(new String[]{"a","b","c"});
        //指定第一个、第二个字符串,再跟list中的元素进行连接
        String str2 = Joiner.on("@").join("first","second",Lists.newArrayList("a","b","c"));
        System.out.println(str);
        System.out.println(str);

        //跳过list中的空值,这里的空值是指null,并不包括空字符串
        String str3 = Joiner.on(",").skipNulls().join(Lists.newArrayList("a","b"," ",null,"c",null));
        System.out.println(str3);

        //useForNull(str)用指定的字符串来替换空值
        String str4 = Joiner.on(",").useForNull("#").join(Lists.newArrayList("a","b"," ",null,"c",null));
        System.out.println(str4);

        Map<String,String> map = Maps.newHashMap();
        map.put("a","1");
        map.put("b","2");
        map.put("c","3");
        //withKeyValueSeparator用:来连接map的key和value,再将连接好的key和value用逗号分隔
        String str5 = Joiner.on(",").withKeyValueSeparator(":").join(map);
        System.out.println(str5);
    }
Splitter

Splitter用于字符串的分隔,与Joiner正好是相反的操作

@Test
    public void splitterTest(){
        List<String> list = Splitter.on(",").splitToList("a,b,c,d");
        System.out.println(list);

        Splitter.on(",").split("a,b,c,d").forEach( s -> {
            System.out.println(s);
        });

        //过滤掉空字符串,但不包括空格
        List<String> list1 = Splitter.on(",").omitEmptyStrings().splitToList("a,b,, ,c,d");
        System.out.println("list1:" + list1);  //输出:[a, b, ,c, d]

        //去掉字符串中的空格,再进行过滤空元素
        List<String> list2 = Splitter.on(",").omitEmptyStrings().trimResults().splitToList("a,b,, ,c,d");
        System.out.println("list2:" + list2); //输出 [a, b, c, d]

        //limit表示最多把字符串分隔成多少份
        List<String> list3 = Splitter.on("#").omitEmptyStrings().trimResults().limit(2).splitToList("a#b#c#d");
        System.out.println("list3:" + list3);

        //将字串还原成map,是Joiner的逆向操作,注意:字符串的格式必须满足“a:1#b:2”这种格式,格式不对会导致还原map失败
        Map<String,String> map = Splitter.on("#").omitEmptyStrings().trimResults().withKeyValueSeparator(":").split("a:1#b:2");
        System.out.println("map:" + map);

    }

可以看出来,Splitter就是Joiner的逆向操作

Joiner是将字符串拼接起来,Splitter是将字符串拆分

CharMatcher

CharMatcher用来处理复杂的字符串操作,它其实主要解决两个问题:

  • 找到匹配的字符
  • 处理匹配的字符

基本上这两个操作就包含了日常开发中的大部分需求

CharMatcher可以对匹配到的字符串做出多种处理,比如,remove(), replace(), trim(), retain()等等

下面我们举个例子吧

比如,你要提取出“er 3j6o 3k ,)$ wt@ wr4576je ow3453535345irjew jwfel ” 这个字符串中的数字,或者去掉这个字符串中的字母,你要怎么处理,用CharMatcher来处理就很简单

提取字符串中的小写字母

String s = "er 3j6o 3k ,)$ wt@ wr4576je ow3453535345irjew jwfel ";
        //返回只保留a-z的字母的字符中
        String str = CharMatcher.inRange('a','z').retainFrom(s);
        System.out.println(str);

去掉字符串中的数字

String s = "er 3j6o 3k ,)$ wt@ wr4576je ow3453535345irjew jwfel ";
        //去掉字符串中数字
        String str = CharMatcher.digit().removeFrom(s);
        System.out.println(str);

CharMatcher常用的方法分为两类:

  • 用来做匹配的方法
  • 用来处理匹配结果的方法

1、用来做匹配的方法

  • CharMatcher is(char match): 返回匹配指定字符的Matcher
  • CharMatcher isNot(char match): 返回不匹配指定字符的Matcher
  • CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字符的Matcher
  • CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一个字符的Matcher
  • CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配范围内任意字符的Matcher
  • CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判断匹配的Matcher
  • CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher
  • CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher

2、用来处理匹配结果的方法

  • String removeFrom(CharSequence sequence): 删除sequence中匹配到到的字符并返回
  • String retainFrom(CharSequence sequence): 保留sequence中匹配到的字符并返回
  • String replaceFrom(CharSequence sequence, char replacement): 替换sequence中匹配到的字符并返回
  • String trimFrom(CharSequence sequence): 删除首尾匹配到的字符并返回
  • String trimLeadingFrom(CharSequence sequence): 删除首部匹配到的字符
  • String trimTrailingFrom(CharSequence sequence): 删除尾部匹配到的字符
  • String collapseFrom(CharSequence sequence, char replacement): 将匹配到的组(连续匹配的字符)替换成replacement
  • String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace

下面来看一下代码

@Test
    public void charMatcherTest(){
        String str = "aj\tld1\b23aAbCs kF45JAb c56sl";
        //移除str中的a
        CharMatcher.is('a').removeFrom(str);
        //移除str中的a
        CharMatcher.isNot('a').retainFrom(str);
        //保留str中的a,b,c字符
        CharMatcher.anyOf("abc").retainFrom(str);

        //保留str中的a,b,c字符
        CharMatcher.noneOf("abc").removeFrom(str);
        //匹配str中的a-j的字母,全部替换成数字6
        CharMatcher.inRange('a','j').replaceFrom(str,"6");
        //去str中的空格
        CharMatcher.breakingWhitespace().removeFrom(str);
        //去掉str中的数字
        CharMatcher.digit().removeFrom(str);
        //去掉控制字符(\t,\n,\b...)
        CharMatcher.javaIsoControl().removeFrom(str);
        //获取str中的小写字母
        CharMatcher.javaLowerCase().retainFrom(str);
        //获取str中的大写字母
        CharMatcher.javaUpperCase().retainFrom(str);

        //组合条件:获取str中的大写字母和数字
        System.out.println(CharMatcher.javaUpperCase().or(CharMatcher.digit()).retainFrom(str));

    }

这个CharMatcher简直太好用了,能实现各种复杂的字符串匹配和处理

当然,你也可以使用正则表达式实现同样的功能,但毕竟正则表达式不够直观

CharMatcher可以通过方法名一眼就可以看出来

Charsets

Charsets定义了字符编码的常量

  • Charsets.UTF_8
  • Charsets.ISO_8859_1
  • Charsets.US_ASCII
  • Charsets.UTF_16
  • Charsets.UTF_16BE
  • Charsets.UTF_16LE
CaseFormat

CaseFormat是一种实用工具类,以提供不同的ASCII字符格式之间的转换

可以用CaseFormat进行驼峰规则转换,比如,将hello_world转换成helloWorld或HelloWorld

String str = "hello_world";
        CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,str);//转换成helloWorld
        CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,str);//转换成HelloWorld

可以看到,Guava提供的String类的工具都超级实用的,能在平时的开发中节省我们不少时间和代码量

熟练掌握这些工具,能让我们平时的工作如虎添翼,加油吧~ 骚年

相关文章