`

Guava 字符串处理(Joiner, Splitter, CharMatcher)

阅读更多

guava 提供了非常强大的字符串处理操作

 

1 Joiner

   以前肯定遇到过这样的场景,为了sql查询,把一个List<Integer>集合拼接成一个字符串,用逗号隔开,看一下Joiner如何实现的:

  

public static void main (String args[]) {
        List<Integer> list = Lists.newArrayList(1,2,3,4,5);
        Joiner joiner = Joiner.on(",").skipNulls();
        System.out.println(joiner.join(list));
    }

   输出结果:1,2,3,4,5

 

   是不是很方便?Joiner提供on方法,用来作为各个对象之间的连接

 

2 Splitter

   demo:

    public static void main (String[] args) {
        String str = "fasdga, , fasgasd, fasdgas";
        Splitter splitter = Splitter.on(",").omitEmptyStrings().trimResults();
        List<String> stringList = splitter.splitToList(str);
        for (String s : stringList) {
            System.out.println(s + "============");
        }
    }

   on方法指定按什么分割,omitEmptyStrings方法表示分割结果项中有空字符串则忽略, trimResults表示对分割后的结果使用trim方法

 

 

3 Charsets

   类似一个枚举值,提供各种字符集,如:Charsets.UTF_8

 

4 CaseFormat

   CaseFormat被用来方便地在各种ASCII大小写规范间转换字符串——比如,编程语言的命名规范。CaseFormat支持的格式如下:

 

格式 范例
LOWER_CAMEL lowerCamel
LOWER_HYPHEN lower-hyphen
LOWER_UNDERSCORE lower_underscore
UPPER_CAMEL UpperCamel
UPPER_UNDERSCORE UPPER_UNDERSCORE

   此类一般情况下没用,当使用反射的时候可能有用,比如,你想获取一个属性的get方法,属性名称为"name",那么方法名称为getName,如果你不知道具体的属性名称, 你会怎么做呢?

  

    @Override
    public String toString () {
        Field[] fields = this.getClass().getDeclaredFields();
        Objects.ToStringHelper toStringHelper = Objects.toStringHelper(this.getClass());
        try {
            for (Field field : fields) {
                //这里用到CaseFormat,把方法名转换成驼峰标示(当然这里也可以自己动手去处理字符串)
                String methodName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, "get-" + field.getName());
                Method method = this.getClass().getMethod(methodName);
                toStringHelper.add(field.getName(), method.invoke(this));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return toStringHelper.toString();
    }
 

 

5 CharMatcher

   (1)CharMatcher 实现了接口Predicate<Character>,可用来作为集合的过滤器,CharMatcher是一个抽象类,如果要实现自己的CharMatcher要实现方法matches方法

   (2)CharMatcher 一般情况下做了两件事:

          2.1 匹配字符,获取到CharMatcher

          2.2 在获取到的CharMatcher上做操作

    (3)CharMatcher 自己提供了很多CharMatcher的实现:

            ANY: 匹配任何字符

            ASCII: 匹配是否是ASCII字符

            BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")

            DIGIT: 匹配ASCII数字 

            INVISIBLE: 匹配所有看不见的字符

            JAVA_DIGIT: 匹配UNICODE数字, 使用 Character.isDigit() 实现

            JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现

            JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现

            JAVA_LETTER_OR_DIGET: 匹配数字或字母

            JAVA_LOWER_CASE: 匹配小写

            JAVA_UPPER_CASE: 匹配大写

            NONE: 不匹配所有字符

            SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽

            WHITESPACE: 匹配所有空白字符

     (4)CharMatcher 提供了一些静态方法来让使用者更方便的获取CharMater对象,来处理字符串:

              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 negate(): 返回以当前Matcher判断规则相反的Matcher

              CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher

              CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher

      (5)上面几条主要讲了默认实现的CharMatcher,以及如果获取CharMatcher,下面说一下,获取到了CharMatcher如何处理字符:

             boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字符能匹配Matcher,返回true

             boolean matchesAllOf(CharSequence sequence): sequence中所有字符都能匹配Matcher,返回true

             boolean matchesNoneOf(CharSequence sequence): sequence中所有字符都不能匹配Matcher,返回true

             int indexIn(CharSequence sequence): 返回sequence中匹配到的第一个字符的坐标

             int indexIn(CharSequence sequence, int start): 返回从start开始,在sequence中匹配到的第一个字符的坐标

             int lastIndexIn(CharSequence sequence): 返回sequence中最后一次匹配到的字符的坐标

             int countIn(CharSequence sequence): 返回sequence中匹配到的字符计数

             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

       (6) 有兴趣的同学可以看一下CharMatcher的源码,可以发现CharMatcher对String的操作并没有什么高明之处,把String转化成char数组,然后根据需要做对应的操作,个人感觉CharMatcher比较好的地方在于,

                 作为一个工具类,提供了非常好用的api,使用内部类And和Or去实现多个CharMatcher实现与或操作,这种编码风格非常值得借鉴

             

    public static void main (String[] args) {
        String str = "12312,agg  ";
        CharMatcher charMatcher1 = CharMatcher.is('1');
        CharMatcher charMatcher2 = CharMatcher.is('2');
        //两个CharMatcher或操作
        CharMatcher charMatcher3 = charMatcher1.or(charMatcher2);
        System.out.println(charMatcher3.retainFrom(str));
    }
  
  //charMatcher1.or的源码实现
  public CharMatcher or(CharMatcher other) {
    return new Or(this, checkNotNull(other));
  }
  
  //在CharMatcher内部定义了一个Or类,用来实现两个CharMatcher的Or操作,这是一种非常好的代码风格
  private static class Or extends CharMatcher {
    final CharMatcher first;
    final CharMatcher second;

    Or(CharMatcher a, CharMatcher b, String description) {
      super(description);
      first = checkNotNull(a);
      second = checkNotNull(b);
    }

    Or(CharMatcher a, CharMatcher b) {
      this(a, b, "CharMatcher.or(" + a + ", " + b + ")");
    }

    @GwtIncompatible("java.util.BitSet")
    @Override
    void setBits(BitSet table) {
      first.setBits(table);
      second.setBits(table);
    }

    @Override
    public boolean matches(char c) {
      return first.matches(c) || second.matches(c);
    }

    @Override
    CharMatcher withToString(String description) {
      return new Or(first, second, description);
    }
  }

 

分享到:
评论

相关推荐

    Guava使用培训教程

    通过上述介绍可以看出,Guava库为Java开发提供了强大的工具支持,尤其是在字符串处理方面,如 `Joiner`、`Splitter` 和 `CharMatcher` 等工具类,它们不仅能提升代码的可读性和维护性,还能有效提高程序的运行效率。...

    guava,google项目名称、集合、缓存、原语支持、并发库、公共注释、字符串处理、i/o。美国石油学会.zip

    6. 字符串处理:Guava提供了许多静态方法,用于处理字符串,如Joiner和Splitter,它们在连接或分割字符串时比Java内置的方法更强大、更易用。 7. I/O:Guava的I/O工具提供了更高效的文件读写操作,例如Files类提供...

    guava-18.jar

    5. **字符串处理**:Guava提供了各种字符串处理工具,如Joiner(用于连接字符串)、Splitter(用于分割字符串)和CharMatcher(用于匹配字符)等,简化了日常的字符串操作。 6. **I/O工具**:Guava提供了文件读写、...

    Guava入门指南培训PPT

    Guava中的字符串处理工具极大地方便了开发人员进行字符串操作。 ##### Joiner:合并字符串 `Joiner` 类用于将列表中的元素连接成一个字符串,并且可以在元素之间添加分隔符。还支持过滤空值等功能。 **示例**: ...

    Guava 工程项目包 有实例

    - **Joiner 和 Splitter**:Guava 提供了 Joiner 和 Splitter 类,用于高效地连接字符串和分割字符串,比使用 "+" 或 String.split() 更加灵活和高效。 - **预格式化字符串**:Preconditions 类提供了一些静态方法...

    guava-jdk5

    5. **字符串处理**:Guava提供了一系列的字符串处理工具,如Joiner、Splitter、CharMatcher等,使字符串操作更加方便和高效。例如,Joiner可以方便地将多个字符串连接成一个,Splitter可以按特定规则分割字符串。 6...

    guava.zip

    字符串处理方面,Guava 提供了 Joiner 和 Splitter 类,它们使得字符串连接和分割更加灵活和高效。例如,Joiner 可以轻松地将集合或数组元素连接成一个字符串,而 Splitter 可以按照自定义规则对字符串进行拆分。 ...

    guava-r07.zip

    字符串处理是Guava的另一个亮点,它提供了Joiner和Splitter工具类,简化了字符串连接和分割操作。此外,还有CharMatcher,用于匹配字符序列,以及Strings类,包含大量静态方法来处理和验证字符串。 Guava对原生类型...

    guava-API文档

    4. 字符串处理:Guava包含了一些方便的字符串处理方法,如Joiner和Splitter,它们可以更方便地进行字符串的连接和分割操作。此外,CharMatcher类可以帮助进行字符过滤,Strings类则提供了各种字符串操作的静态方法。...

    guavapdf-ch_GoogleGuava官方教程_

    Guava提供了许多字符串处理的辅助方法,如Joiner和Splitter,它们分别用于连接字符串和分割字符串。Strings类包含了一些实用的静态方法,如isNullOrEmpty、commonPrefix等,可以更方便地处理字符串。 **实用方法** ...

    google guava 中文教程

    Guava提供了更高效、更简洁的字符串处理工具,如Strings类中的join()方法用于拼接字符串,Joiner类提供了更灵活的连接功能,Splitter类则帮助我们根据特定分隔符拆分字符串。 五、函数式编程 Guava引入了Function...

    guava源码src

    4. **字符串处理**:Guava提供了丰富的字符串工具,如Joiner、Splitter、CharMatcher等,可以方便地进行字符串连接、分割和过滤。这些工具在处理复杂字符串操作时,比Java内置的String类更加高效和灵活。 5. **函数...

    Google Guava 官方教程

    Guava 提供了有用的字符串工具,如 Joiner 和 Splitter,用于高效地连接和拆分字符串。此外,Strings 类包含了许多静态方法,用于处理常见字符串操作。 6. **I/O 工具** Guava 的 Files 和 CharStreams 模块提供...

    google开源项目guava.jar包

    另外,Splitter和Joiner类则帮助我们更灵活地处理字符串分割与连接。 I/O操作在Guava中通过Files、ByteStreams、CharStreams等类得到优化,它们提供了更高效、简洁的接口来读写文件、处理流。例如,Files类允许直接...

    guava-19.0

    - Guava提供了CharMatcher、Splitter、Joiner等工具类,方便进行复杂的字符串操作。19.0版本可能优化了这些工具的性能,或者引入了新的字符串处理功能。 5. **I/O操作**: - Guava的I/O库提供了流处理、文件读写...

    Guava是个风火轮之基础工具(1)Java开发Java经

    此外,Guava对字符串处理也有一套完整的工具,如Strings、Joiner、Splitter等。Strings类中包含了很多静态方法,用于检查、清理、格式化字符串;Joiner和Splitter则分别用于连接字符串数组和分割字符串,提供了比...

    guava学习笔记

    总结来说,Guava工具包为Java开发者提供了大量实用的功能,涵盖了字符串处理、集合操作、参数校验等多个方面。通过上述几个核心类的介绍,我们可以看到Guava在简化代码编写、提高代码质量方面的显著作用。对于Java...

    guava多个版本jar包

    此外,还有并发工具,如CountDownLatch、Future和ListenableFuture,以及强大的字符串处理类,如Joiner和Splitter。它还包含了Guava的缓存机制,允许高效地存储和检索数据。 2. guava-18.0.jar:这是一个较大的升级...

    Google-guava 19.0

    此外,Splitter和Joiner类则在字符串分割和合并上提供了更高效的方式。 **6. 函数式编程** Guava引入了Function、Predicate、Supplier等函数式接口,支持lambda表达式的使用,使得代码更加简洁、可读性更强。...

    Getting Started with Google Guava code

    5. **字符串处理**:Guava 提供了各种字符串工具,如 Joiner、Splitter 和 CharMatcher,可以更方便地进行字符串操作。 6. **I/O 操作**:Guava 提供了 Files、ByteStreams 和 CharStreams 等类,使得文件读写和流...

Global site tag (gtag.js) - Google Analytics