Guava的骚操作,大大提升了我摸鱼的时间


概述

1、Guavagoogle公司开发的一款Java类库扩展工具包,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库,以及用于缓存、并发、I/O等实用程序。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。

2、Guava github 开源地址:https://gitcode.net/mirrors/google/guava

3、官网用户手册:https://github.com/google/guava/wiki


POM依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
</dependency>

一、以面向对象思想处理字符串(Joiner/Splitter/CharMatcher)

JDK提供的String还不够好么?

也许还不够友好,至少我们用起来还不是特别够爽,还得进行其余的操作!

举例:比如String的split()方法,我们得校验空字符串的问题,还得考虑返回的结果是否存在null元素,只提供了前后trim()的方法(但中间元素存在空或null呢)。

guava帮你解决,实例如下:

    // 连接器
    private static final Joiner JOINER = Joiner.on(",").skipNulls();

    // 分割器
    private static final Splitter SPLITTER = Splitter.on(",").trimResults().omitEmptyStrings();

    public static void main(String[] args) {
        // 把集合或数组中的元素拼接在一起
        String join = JOINER.join(Lists.newArrayList("a", null, "b"));
        System.out.println("拼接后的字符串:" + join);
        // 分隔处理
        for (String tmp : SPLITTER.split("a,  ,b,,")) {
            System.out.println("|" + tmp + "|");
        }
    }

打印结果:

Joiner是连接器,Splitter是分割器,通常我们会把它们定义为static final,利用on生成对象后在应用到String进行处理,这块是可以复用的。要知道apache commons StringUtils提供的都是static method。更加重要的是,guava提供的Joiner/Splitter是经过充分测试,它的稳定性和效率要比apache高出不少,这个小伙伴们可以自行测试下~

发现没有我们想对String做什么操作,就是生成自己定制化的Joiner/Splitter,多么贴心、多效的API!

对于Joiner,常用的方法是:

1.跳过NULL元素:skipNulls()

2.对于NULL元素使用其他替代:useForNull(String)

对于Splitter,常用的方法是:trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串,还有正则,还有固定长度分割(太贴心了!)

其实除了Joiner/Splitter外,guava还提供了字符串匹配器:CharMatcher(将字符的匹配和处理解耦,并提供丰富的方法供你使用)

CharMatcher:

1、默认实现类:

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: 匹配所有空白字符。

2、常用操作方法:

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;
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。

例子:

    public static void main(String[] args) {
        // 只保留匹配的字符并移除其他字符
        System.out.println(CharMatcher.digit().retainFrom("1hs2fsl3ds4g5-"));
        // 移除匹配的字符
        System.out.println(CharMatcher.digit().removeFrom("i love java 1314"));
        // 将匹配的字符用“*”号替换
        System.out.println(CharMatcher.inRange('a', 'f').or(CharMatcher.is('n')).replaceFrom("zhangsanfeng", "*"));
    }

打印结果:

二、对基本类型进行支持

guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!

    public static void main(String[] args) {

        // 快速完成到集合的转换
        List<Integer> list = Ints.asList(1, 3, 5, 7, 9);
        System.out.println(list);

        String join = Ints.join(",", 1, 3, 1, 4);
        System.out.println(join);

        // 原生类型数组快速合并
        int[] newIntArray = Ints.concat(new int[]{1, 2}, new int[]{2, 3, 4});
        System.out.println(Arrays.toString(newIntArray));

        // 取最大值和最小值
        int max = Ints.max(newIntArray);
        int min = Ints.min(newIntArray);
        System.out.println("最大值:" + max);
        System.out.println("最小值:" + min);

        // 是否包含指定元素
        System.out.println("是否包含:" + Ints.contains(newIntArray, 6));

        // 集合到数组的转换
        int[] array = Ints.toArray(list);
        System.out.println(array);
    }

打印结果:

 

Guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。 

猜你喜欢

转载自blog.csdn.net/weixin_42555014/article/details/130930854