Guava CharMatcher 源码分析

本文深入解析了CharMatcher类的内部实现及应用,详细介绍了其提供的字符串处理方法,包括找到匹配的字符串和处理匹配的字符串两大类。同时,文章列举了CharMatcher的多个内部实现类,如ANY、ASCII、DIGIT等,以及如何通过这些类进行字符串匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CharMatcher

CharMatcher提供了多种对字符串处理的方法,大概分为找到匹配的字符串和处理匹配的字符串两种。其中内部实现了大量的公用内部类,用来方便用户对字符串进行匹配,并且实现了大量处理字符串的方法。

CharMatcher本身是一个抽象类,也有一些抽象方法,它主要依靠内部继承ChatMatcher的内部子类来是想抽象方法和重写一些方法。

1. 内部实现类

CharMatcher的内部实现类可以进行字符串的匹配。

// 以JavaDigital为例
// 匹配Unicode数字
// 1. 静态工厂,返回JavaDigital实例
public static CharMatcher javaDigit() {
    return JavaDigit.INSTANCE;
}
// 2. 静态常量,初始化调用1
public static final CharMatcher JAVA_DIGIT = javaDigit();

// 实现
private static final class JavaDigit extends CharMatcher {
    
    static final JavaDigit INSTANCE = new JavaDigit();

    @Override
    public boolean matches(char c) {
        return Character.isDigit(c);
    }

    @Override
    public String toString() {
        return "CharMatcher.javaDigit()";
    }
}

/**
 * CharMatcher的内部类均采用以上形式实现以及调用
 */
ANY: 匹配任何字符
ASCII: 匹配是否是ASCII字符
BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")
DIGIT: 匹配ASCII数字 
INVISIBLE: 匹配所有看不见的字符
JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
JAVA_LETTER_OR_DIGET: 匹配数字或字母
JAVA_LOWER_CASE: 匹配小写
JAVA_UPPER_CASE: 匹配大写
NONE: 不匹配所有字符
SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
WHITESPACE: 匹配所有空白字符
常用操作方法

CharMatcher提供了一些对字符串进行处理的方法。

// 返回匹配指定字符match的Matcher
CharMatcher is(char match);

// 返回不匹配指定字符match的Matcher
CharMatcher isNot(char match);

// 返回匹配sequence中任意字符的Matcher
CharMatcher anyOf(CharSequence sequence);

// 返回不匹配sequence中任何一个字符的Matcher
CharMatcher noneOf(CharSequence sequence);

// 返回匹配范围内任意字符的Matcher
CharMatcher inRange(char startInclusive, char endIncludesive);

// 返回使用predicate的apply()判断匹配的Matcher
CharMatcher forPredicate(Predicate<? super Charater> predicate);

// 返回以当前Matcher判断规则相反的Matcher
CharMatcher negate();

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

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

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

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

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

// 返回sequence中匹配到的第一个字符的下标
int indexIn(CharSequence sequence);

// 返回从start开始,在sequence中匹配到的第一个字符的下标
int indexIn(CharSequence sequence, int 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)

// 删除sequence首部匹配到的字符
String trimLeadingFrom(CharSequence sequence);

// 删除sequence尾部匹配到的字符
String trimTrailingFrom(CharSequence sequence);

// 将经过匹配的sequence替换成replacement 
String collapseFrom(CharSequence sequence, char replacement);

// 将sequence先trim再replace
String trimAndCollapseFrom(CharSequence sequence, char replacement);
### Guava Cache 源码解析教程 #### 一、概述 Guava Cache 是 Google 开发的一个高性能本地缓存库,适用于 Java 应用程序。该库提供了一种线程安全的方式管理内存中的键值对集合[^2]。 #### 二、核心组件介绍 ##### 1. 数据结构设计 Guava Cache 的内部实现了多种优化的数据结构用于高效存储和访问缓存项。这些数据结构的设计旨在平衡时间和空间复杂度,确保良好的性能表现[^1]。 ##### 2. 自动回收机制 不同于 `ConcurrentMap` 需要手动删除过期条目,Guava Cache 支持设置最大容量、存活时间等参数来自动生成淘汰策略,从而有效控制资源消耗。 #### 三、主要功能模块详解 ##### 1. CacheLoader 类的作用 `CacheLoader` 定义了一个抽象类,允许开发者自定义当缓存未命中时如何获取新值的方法。这使得应用程序可以根据具体需求灵活地决定加载逻辑[^3]。 ```java public class MyCustomCacheLoader extends CacheLoader<String, String> { @Override public String load(String key) throws Exception { // 实现具体的加载逻辑 return "Value for " + key; } } ``` ##### 2. LoadingCache 接口及其子类 `LoadingCache<K,V>` 继承自 `Cache<K,V>` 并增加了自动装载能力。通过实现特定的加载器(`CacheLoader`)可以构建具有懒加载特性的实例对象[^4]。 ```java LoadingCache<Object, Object> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterWrite(10, TimeUnit.MINUTES) .build( new CacheLoader<Object, Object>() { @Override public Object load(Object key) throws Exception { return computeExpensiveValue(key); } }); ``` #### 四、初始化方式举例 除了上述提到的 loader 方式外,还可以采用预填充的方式来创建已含有初始映射关系的缓存实例[^5]。 ```java // 使用ImmutableMap作为输入快速建立带有默认值的缓存 Cache<Integer, Integer> prepopulatedCache = CacheBuilder.<Integer, Integer>newBuilder().build(CacheLoader.from(Map.of(1, 1))); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值