Guava-base接口|Ascii|CharMatcher

来源:互联网 发布:sql server count 1 编辑:程序博客网 时间:2024/06/05 14:30

接口:

1.supplier定义了接口,接口只定义了一个方法get,用以返回实例

public interface Supplier<T> {

  /**
   * Retrieves an instance of the appropriate type. The returned object may or
   * may not be a new instance, depending on the implementation.
   *返回的可能是新的instance,或者不是。这个根据具体的实现。
   * @return an instance of the appropriate type
   */
  T get();

}

2.preditate 定义了接口Returns the result of applying this predicate to input.

public interface Predicate<T> {

boolean apply(@Nullable T input);

        @Override
        boolean equals(@Nullable Object object);
}

3.Function<F,T>定义了接口

public interface Function<F, T> {

@Nullable T apply(@Nullable F input);

        @Override
        boolean equals(@Nullable Object object);
}

4.FinalizableReference 

public interface FinalizableReference {

         void finalizeReferent();
}

类:

1.final class Ascii,定义了private 构造函数,不能创建新对象。

定义了1-32,0,127

以及一些静态方法:

  public static boolean isUpperCase(char c) {    return (c >= 'A') && (c <= 'Z');  }    public static boolean isLowerCase(char c) {    // Note: This was benchmarked against the alternate expression "(char)(c - 'a') < 26" (Nov '13)    // and found to perform at least as well, or better.    return (c >= 'a') && (c <= 'z');  }//通过与运算,可将讲lowercase 字符转换成大写字符    public static char toUpperCase(char c) {    return isLowerCase(c) ? (char) (c & 0x5f) : c;  }    public static char toLowerCase(char c) {    return isUpperCase(c) ? (char) (c ^ 0x20) : c;  } //定义了讲chars ,string进行upcase与lowercase的方法  CharSequence是String实现的一个接口,相当简单,  //就是要求是一串字符。所以每个参数类型是/CharSequence的方法,都可以实际代入String对象。 //  为什么这些方法不干脆定义String作为参数类型?因为还有其他的CharSequence类型的类,  //比如StringBuffer和StringBuilder这两个很重要的类。  String对象是不可变的,这两个可变,所以我们在构造  //字符串的过程中往往要用到StringBuffer和StringBuilder。如果那些方法定义String作为参数类型,那么就没法对  //它们用那些方法,先得转化成String才能用。但StringBuffer和StringBuilder转换为String再转换过来很化时间的,  //用它们而不是直接用String的“加法”来构造新String本来就是为了省时间,所以如果用String作为参数类型就杯具了。  /*只写一种转换*/    public static String toLowerCase(CharSequence chars) {    if (chars instanceof String) {//判断是否是String类型      return toLowerCase((String) chars);    }    int length = chars.length();    //新建StringBuilder,并放入参数    StringBuilder builder = new StringBuilder(length);    for (int i = 0; i < length; i++) {      builder.append(toLowerCase(chars.charAt(i)));    }    return builder.toString();  }  //返回字母的顺序。private static int getAlphaIndex(char c) {// Fold upper-case ASCII to lower-case and// make zero-indexed and unsigned (by casting to char).return (char) ((c | 0x20) - 'a');}   //判断两个字母串,忽略大小写是否相等public static boolean equalsIgnoreCase(CharSequence S1,CharSequence S2){if(S1 == S2){return true;}if(S1.length() != S2.length()){return false;}int len = S1.length();for(int i = 0;i < len;i++){char c1 = S1.charAt(i);char c2 = S2.charAt(i);if(c1 == c2){continue;}int n1 = getAlphaIndex(c1);int n2 = getAlphaIndex(c2);if(n1 < 26 && n1 == n2){continue;}else{return false;}}return true;}//还有字符代换的函数@Beta  @CheckReturnValue  public static String truncate(CharSequence seq, int maxLength, String truncationIndicator) 

2:charmatcher,其实现Predicate<Character>接口,要重写

public boolean apply(Character character) {    return matches(character);  }

返回第一个匹配的下标:

  public int indexIn(CharSequence sequence) {    int length = sequence.length();    for (int i = 0; i < length; i++) {      if (matches(sequence.charAt(i))) {        return i;      }    }    return -1;  }
包含起始位置的:
  public int indexIn(CharSequence sequence, int start) {    int length = sequence.length();    Preconditions.checkPositionIndex(start, length);    for (int i = start; i < length; i++) {      if (matches(sequence.charAt(i))) {        return i;      }    }    return -1;  }
可以使用的方法,如下图:
以及用marcher进行两个charsequence替换代码:

  public String replaceFrom(CharSequence sequence, CharSequence replacement) {    int replacementLen = replacement.length();    if (replacementLen == 0) {      return removeFrom(sequence);    }    if (replacementLen == 1) {      return replaceFrom(sequence, replacement.charAt(0));    }    String string = sequence.toString();    int pos = indexIn(string);    if (pos == -1) {      return string;    }    int len = string.length();    StringBuilder buf = new StringBuilder((len * 3 / 2) + 16);//?    int oldpos = 0;    do {      buf.append(string, oldpos, pos);      buf.append(replacement);      oldpos = pos + 1;      pos = indexIn(string, oldpos);    } while (pos != -1);    buf.append(string, oldpos, len);    return buf.toString();  }
源码中构建了一些常用的macher:

和一些构造方法:



以anyOf为例:

  public static CharMatcher anyOf(final CharSequence sequence) {    switch (sequence.length()) {//判断charsequence长度,以避免重复代码。
<span style="white-space:pre"></span>假如长度大于2,新建字符数组,先进行排序。重写了matches方法(通过Arrays的二分法查找判断结果是不是大于0来判断);
      case 0:        return NONE;      case 1:        return is(sequence.charAt(0));      case 2:        return isEither(sequence.charAt(0), sequence.charAt(1));      default:        // continue below to handle the general case    }    // TODO(user): is it potentially worth just going ahead and building a precomputed matcher?    final char[] chars = sequence.toString().toCharArray();    Arrays.sort(chars);    StringBuilder description = new StringBuilder("CharMatcher.anyOf(\"");    for (char c : chars) {      description.append(showCharacter(c));    }    description.append("\")");    return new CharMatcher(description.toString()) {      @Override public boolean matches(char c) {        return Arrays.binarySearch(chars, c) >= 0;      }      @Override      @GwtIncompatible("java.util.BitSet")      void setBits(BitSet table) {        for (char c : chars) {          table.set(c);        }      }    };  }

0 0
原创粉丝点击