guava 常用工具类

guava 常用工具类

字符处理

CaseFormat 命名格式转换

用于在不同的命名格式之间进行转换。常见的命名格式包括下划线分隔(如 LOWER_UNDERSCORE)、驼峰命名(如 LOWER_CAMELUPPER_CAMEL)、中划线分隔(如 LOWER_HYPHEN)等。

以下是 CaseFormat 支持的几种命名格式:

  • LOWER_HYPHEN(如 lower-hyphen)
  • LOWER_UNDERSCORE(如 lower_underscore)
  • LOWER_CAMEL(如 lowerCamel)
  • UPPER_CAMEL(如 UpperCamel)
  • UPPER_UNDERSCORE(如 UPPER_UNDERSCORE)
 	    // 示例字符串
        String lowerUnderscore = "example_string";
        String lowerHyphen = "example-string";
        String lowerCamel = "exampleString";
        String upperCamel = "ExampleString";
        String upperUnderscore = "EXAMPLE_STRING";

		// 下划线分隔 -> 驼峰命名
        String result1 = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, lowerUnderscore);
        System.out.println("LOWER_UNDERSCORE to LOWER_CAMEL: " + result1);

        // 中划线分隔 -> 下划线分隔
        String result2 = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_UNDERSCORE, lowerHyphen);
        System.out.println("LOWER_HYPHEN to LOWER_UNDERSCORE: " + result2);

        // 驼峰命名 -> 大写驼峰命名
        String result3 = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, lowerCamel);
        System.out.println("LOWER_CAMEL to UPPER_CAMEL: " + result3);

        // 大写驼峰命名 -> 下划线分隔
        String result4 = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, upperCamel);
        System.out.println("UPPER_CAMEL to LOWER_UNDERSCORE: " + result4);

        // 大写下划线分隔 -> 小写中划线分隔
        String result5 = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, upperUnderscore);
        System.out.println("UPPER_UNDERSCORE to LOWER_HYPHEN: " + result5);

CharMatcher 字符串的匹配与过滤

用于处理字符和字符串的匹配与过滤。CharMatcher 提供了一种方便的方式来匹配、过滤、替换字符串中的字符,支持多种预定义的匹配器(如匹配字母、数字、空白字符等)以及自定义匹配器。

以下是一些常用的 CharMatcher 方法和预定义的匹配器:

  • CharMatcher.any(): 匹配任何字符。
  • CharMatcher.none(): 不匹配任何字符。
  • CharMatcher.whitespace(): 匹配空白字符(空格、制表符等)。
  • CharMatcher.digit(): 匹配数字字符。
  • CharMatcher.javaLetter(): 匹配 Java 字母字符。
  • CharMatcher.javaDigit(): 匹配 Java 数字字符。
  • CharMatcher.is(char c): 匹配指定的字符。
  • CharMatcher.isNot(char c): 匹配不是指定的字符。
  • CharMatcher.inRange(char startInclusive, char endInclusive): 匹配指定范围内的字符。

以下是一些常用的操作方法:

  • retainFrom(CharSequence sequence): 保留匹配的字符。
  • removeFrom(CharSequence sequence): 移除匹配的字符。
  • replaceFrom(CharSequence sequence, char replacement): 替换匹配的字符。
  • collapseFrom(CharSequence sequence, char replacement): 将连续匹配的字符替换为单个字符。
  • trimFrom(CharSequence sequence): 去除字符串前后的匹配字符。
        String input = "This is a sample text, 1234!";

        // 保留数字字符
        String digitsOnly = CharMatcher.digit().retainFrom(input);
        System.out.println("Digits only: " + digitsOnly); // 输出: 1234

        // 移除空白字符
        String noWhitespace = CharMatcher.whitespace().removeFrom(input);
        System.out.println("No whitespace: " + noWhitespace); // 输出: Thisisasampletext,1234!

        // 将所有字母转换为大写
        String upperCaseLetters = CharMatcher.javaLetter().replaceFrom(input, c -> Character.toUpperCase(c));
        System.out.println("Upper case letters: " + upperCaseLetters); // 输出: THIS IS A SAMPLE TEXT, 1234!

        // 将连续的空白字符替换为单个空格
        String collapsedWhitespace = CharMatcher.whitespace().collapseFrom(input, ' ');
        System.out.println("Collapsed whitespace: " + collapsedWhitespace); // 输出: This is a sample text, 1234!

        // 去除字符串前后的标点符号
        String trimPunctuation = CharMatcher.javaLetterOrDigit().negate().trimFrom(input);
        System.out.println("Trim punctuation: " + trimPunctuation); // 输出: This is a sample text, 1234

        // 自定义匹配器:匹配所有小写字母
        CharMatcher lowerCaseMatcher = CharMatcher.inRange('a', 'z');
        String lowerCaseLetters = lowerCaseMatcher.retainFrom(input);
        System.out.println("Lower case letters: " + lowerCaseLetters); // 输出: hisisasampletext
 

Converter 类型转换

用于在两种类型之间进行转换。Converter 提供了一种类型安全的方式来实现双向转换,可以定义从类型 A 到类型 B 的转换逻辑,以及从类型 B 到类型 A 的逆向转换逻辑。

以下是 Converter 类的一些关键方法:

  • doForward(A a): 将类型 A 转换为类型 B。
  • doBackward(B b): 将类型 B 转换为类型 A。
  • convert(A a): 调用 doForward 方法进行转换。
  • reverse(): 返回一个新的 Converter,其转换逻辑与当前 Converter 相反。
  • andThen(Converter<B, C> other): 返回一个组合转换器,先应用当前转换器再应用 other 转换器。
import com.google.common.base.Converter;

public class ConverterExample {
    public static void main(String[] args) {
        // 创建一个字符串到整数的转换器
        Converter<String, Integer> stringToIntegerConverter = new Converter<String, Integer>() {
            @Override
            protected Integer doForward(String s) {
                return Integer.valueOf(s);
            }

            @Override
            protected String doBackward(Integer integer) {
                return integer.toString();
            }
        };

        // 使用转换器进行正向转换
        String str = "1234";
        Integer intValue = stringToIntegerConverter.convert(str);
        System.out.println("String to Integer: " + intValue); // 输出: 1234

        // 使用转换器进行反向转换
        String reversedStr = stringToIntegerConverter.reverse().convert(intValue);
        System.out.println("Integer to String: " + reversedStr); // 输出: 1234

        // 创建一个小写到大写的转换器
        Converter<String, String> lowerToUpperConverter = new Converter<String, String>() {
            @Override
            protected String doForward(String s) {
                return s.toUpperCase();
            }

            @Override
            protected String doBackward(String s) {
                return s.toLowerCase();
            }
        };

        // 组合转换器:先将字符串转换为整数,再将整数转换为大写字符串
        Converter<String, String> combinedConverter = stringToIntegerConverter.andThen(new Converter<Integer, String>() {
            @Override
            protected String doForward(Integer integer) {
                return "Number: " + integer;
            }

            @Override
            protected Integer doBackward(String s) {
                return Integer.valueOf(s.replace("Number: ", ""));
            }
        });

        // 使用组合转换器进行转换
        String combinedResult = combinedConverter.convert(str);
        System.out.println("Combined Converter Result: " + combinedResult); // 输出: Number: 1234

        // 使用组合转换器进行反向转换
        String originalStr = combinedConverter.reverse().convert(combinedResult);
        System.out.println("Original String: " + originalStr); // 输出: 1234
    }
}

Defaults 默认值

com.google.common.base.Defaults 是 Google Guava 库中的一个类,用于提供 Java 基本数据类型和一些常见对象类型的默认值。这个类主要用在需要默认值的场景下,比如在反射或者泛型编程中。

        boolean defaultBoolean = Defaults.defaultValue(boolean.class);
        byte defaultByte = Defaults.defaultValue(byte.class);
        char defaultChar = Defaults.defaultValue(char.class);
        double defaultDouble = Defaults.defaultValue(double.class);
        float defaultFloat = Defaults.defaultValue(float.class);
        int defaultInt = Defaults.defaultValue(int.class);
        long defaultLong = Defaults.defaultValue(long.class);
        short defaultShort = Defaults.defaultValue(short.class);

Joiner 多字符串处理

用于将多个字符串或对象连接成一个字符串。它提供了一种简洁而强大的方式来处理字符串连接,支持处理 null 值以及指定分隔

常用方法

on(String delimiter): 指定分隔符。

skipNulls(): 跳过 null 值。

useForNull(String nullText): 将 null 值替换为指定的字符串。

join(Iterable<?> parts): 将集合中的元素连接成一个字符串。

join(Object[] parts): 将数组中的元素连接成一个字符串。

join(Object first, Object second, Object... rest): 将多个参数连接成一个字符串。

Splitter 字符串拆分

用于将字符串拆分为子字符串。它提供了比 String.split 更加灵活和强大的功能,支持多种拆分模式和选项,例如去除空白字符串、去除结果中的空格、限制拆分结果的数量等。

常用方法

  1. 基础拆分

    • Splitter.on(char separator): 基于单个字符进行拆分。
    • Splitter.on(String separator): 基于字符串进行拆分。
    • Splitter.onPattern(String pattern): 基于正则表达式进行拆分。
    • Splitter.on(CharMatcher charMatcher): 基于 CharMatcher 进行拆分。
  2. 配置选项

    • omitEmptyStrings(): 忽略空字符串。
    • trimResults(): 去除结果中的空格。
    • trimResults(CharMatcher charMatcher): 根据 CharMatcher 去除结果中的字符。
    • limit(int limit): 限制拆分结果的数量。
  3. 结果类型

    • split(CharSequence sequence): 拆分字符串,返回 Iterable<String>
    • splitToList(CharSequence sequence): 拆分字符串,返回 List<String>
    • splitToMap(CharSequence sequence): 将字符串拆分为键值对,返回 Map<String, String>

Strings 字符串处理

提供了许多静态方法,用于处理和操作字符串。它包含了很多常用的字符串操作方法,可以简化代码并提高可读性。

常用方法

  1. 空字符串处理
    • isNullOrEmpty(String string): 检查字符串是否为 null 或空。
    • nullToEmpty(String string): 将 null 转换为空字符串。
    • emptyToNull(String string): 将空字符串转换为 null
  2. 填充和重复
    • padStart(String string, int minLength, char padChar): 用指定字符在字符串开头进行填充,使其达到指定长度。
    • padEnd(String string, int minLength, char padChar): 用指定字符在字符串末尾进行填充,使其达到指定长度。
    • repeat(String string, int count): 重复字符串指定次数。
  3. 常用方法
    • commonPrefix(CharSequence a, CharSequence b): 返回两个字符串的公共前缀。
    • commonSuffix(CharSequence a, CharSequence b): 返回两个字符串的公共后缀。

集合处理

Lists

常用方法

  1. Lists.newArrayList(): 创建一个可变的、空的 ArrayList
  2. Lists.newArrayList(E... elements): 使用指定的元素创建一个可变的 ArrayList
  3. **Lists.newLinkedList(): **创建一个可变的、空的 LinkedList
  4. Lists.partition(List<T> list, int size): 将一个 List 分割成若干个子列表,每个子列表的大小为指定的 size
  5. Lists.reverse(List<T> list): 返回一个包含相同元素但顺序相反的 List
  6. Lists.transform(List<F> fromList, Function<? super F, ? extends T> function): 返回一个新的 List,该列表是通过将给定列表的每个元素传递给给定函数的结果构成的视图。

Maps

常用方法

  1. **Maps.newHashMap(): **创建一个空的、可变的 HashMap
  2. Maps.newHashMapWithExpectedSize(int expectedSize): 创建一个具有指定初始容量的 HashMap
  3. **Maps.newLinkedHashMap(): **创建一个空的、可变的 LinkedHashMap
  4. **Maps.newTreeMap(): **创建一个空的、可变的 TreeMap
  5. Maps.newConcurrentMap(): 创建一个空的、可变的 ConcurrentMap
  6. Maps.uniqueIndex(Iterable<V> values, Function<? super V, K> keyFunction): 根据指定的键函数创建一个 ImmutableMap,键是由给定函数生成的。
  7. Maps.difference(Map<K, V> left, Map<K, V> right): 返回两个 Map 的差异视图。

Range 范围

Range 类可以表示一个区间,如 [1, 5],(1, 5],[1, 5),(1, 5) 等等。它支持各种各样的操作,包括检查区间是否包含某个值、区间是否相交、区间的并集和交集等。

常用方法

  1. **Range.closed(C lower, C upper):**创建一个包含下限和上限的范围 [lower, upper]
  2. Range.closedOpen(C lower, C upper):创建一个包含下限但不包含上限的范围 [lower, upper)
  3. Range.openClosed(C lower, C upper):创建一个不包含下限但包含上限的范围 (lower, upper]
  4. Range.open(C lower, C upper):创建一个不包含下限和上限的范围 (lower, upper)
  5. Range.atLeast(C endpoint):创建一个从指定值开始的范围 [endpoint, ∞)
  6. Range.atMost(C endpoint):创建一个到指定值为止的范围 (-∞, endpoint]
  7. Range.greaterThan(C endpoint):创建一个大于指定值的范围 (endpoint, ∞)
  8. Range.lessThan(C endpoint):创建一个小于指定值的范围 (-∞, endpoint)
  9. Range.contains(C value):检查范围是否包含指定值。
  10. Range.isConnected(Range<C> other):检查两个范围是否相连。
  11. Range.intersection(Range<C> connectedRange):返回两个相连范围的交集。
  12. Range.span(Range<C> other):返回两个范围的并集。

Set

常用方法

  1. **Sets.newHashSet()**创建一个空的 HashSet
  2. **Sets.newHashSet(E... elements)**创建一个包含指定元素的 HashSet
  3. **Sets.newHashSetWithExpectedSize(int expectedSize)**创建一个具有指定初始容量的 HashSet
  4. **Sets.newLinkedHashSet()**创建一个空的 LinkedHashSet
  5. **Sets.newLinkedHashSet(Iterable<? extends E> elements)**创建一个包含指定元素的 LinkedHashSet
  6. **Sets.newTreeSet()**创建一个空的 TreeSet
  7. **Sets.newTreeSet(Comparator<? super E> comparator)**创建一个带有比较器的空 TreeSet
  8. **Sets.union(Set<E> set1, Set<E> set2)**返回两个集合的并集。
  9. **Sets.intersection(Set<E> set1, Set<E> set2)**返回两个集合的交集。
  10. **Sets.difference(Set<E> set1, Set<E> set2)**返回第一个集合与第二个集合的差集。
  11. **Sets.symmetricDifference(Set<E> set1, Set<E> set2)**返回两个集合的对称差集。
  12. **Sets.cartesianProduct(Set<E>... sets)**返回多个集合的笛卡尔积。
  13. **Sets.powerSet(Set<E> set)**返回给定集合的幂集。