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

news2024/11/28 21:58:45

  • 以面向对象思想处理字符串
  • 对基本类型进行支持
  • 总结

概述

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这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存溢出导致的Full GC异常

背景 线上服务GC耗时过长&#xff0c;普遍10s&#xff0c;此外GC后&#xff0c;内存回收不多 问题一 通过查询gc日志可以发现&#xff0c;CMS进行垃圾回收的时候报concurrent mode failure错误&#xff0c;该错误是因为CMS进行垃圾回收的时候&#xff0c;新生代进行GC产生的对象…

JupyterLab(Jupyter Notebook)安装与使用

文章目录 前言安装JupyterLab切换中文语言JupyterLab desktop 使用演示其它补充后记 前言 目前在看《程序员数学&#xff1a;用Python学透线性代数和微积分》这个书&#xff0c;它里面的代码是在Jupyter中编写的&#xff0c;所以也安装下用用。 JupyterLab是一个可以同时编写…

[PyTorch][chapter 37][经典卷积神经网络-2 ]

1&#xff1a; VGG 2: GoogleNet 一 VGG 1.1 简介 VGGNet 是牛津大学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和谷歌 DeepMind 一起研究出来的深度卷积神经网络&#xff0c;因而冠名为 VGG。VGG是一种被广泛使用的卷积神经网络结构&#xff0c;其在在20…

生成式模型的质量评估标准

Sample Quality Matrix 如何评价生成式模型的效果&#xff1f;ISFIDsFIDPrecision & RecallPrecisonRecall计算precision和recall 如何评价生成式模型的效果&#xff1f; Quality: 真实性&#xff08;逼真&#xff0c;狗咬有四条腿&#xff09; Diversity: 多样性&#x…

全网为数不多清晰可行的在VUE中使用sortable.js实现动态拖拽排序的教程!

目录 0 写在前面的 1 依赖安装 2 手写简单标签演示 3 要点 4 效果 0 写在前面的 首先批评以下文章 (10条消息) sortable.js 实现拖拽_sortablejs_花铛的博客-CSDN博客 (10条消息) sortablejs拖拽排序功能&#xff08;vue&#xff09;_C_fashionCat的博客-CSDN博客 他们…

Spring6入门 + Log4j2

1、环境要求 JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; Maven&#xff1a;3.6 Spring&#xff1a;6.0.2 2、构建模块 &#xff08;1&#xff09;构建父模块spring6 在idea中&#xff0c;依次单击 File -> New -> Project ->…

什么是内部网络分段渗透测试?

网络攻击的规模、范围和复杂性与日俱增。随着黑客及其攻击方法变得越来越复杂&#xff0c;您的企业必须做出相应的响应&#xff0c;否则您的安全边界就会不堪重负。 如今&#xff0c;内部网络分段是将攻击成功风险降至最低、改善数据流和隔离关键支付数据的主要方法之一。 但是…

【U-Boot 之七】fastboot原理分析及uboot fastboot功能实践

本文首先介绍了fastboot的基本原理&#xff0c;然后分析了uboot中fastboot的实现&#xff0c;最后&#xff0c;从实践的角度测试了fastboot协议及各种fastboot命令的使用方式等 。本文的仅按照我本人的实际测试过程进行了简单的描述。若有不当之处&#xff0c;欢迎各位大神不吝…

专家警告AI可能会导致人类灭绝?

人工智能可能导致人类灭绝&#xff0c;包括 OpenAI 和 Google Deepmind 负责人在内的专家警告说 数十人支持在人工智能安全中心 的网页上发表的声明。 它写道&#xff1a;“减轻人工智能灭绝的风险应该与其他社会规模的风险&#xff08;如流行病和核战争&#xff09;一起成为全…

Linux系统安装RabbitMQ

rabbitmq安装 说明&#xff1a;本次使用centos7.9 安装虚拟机. 1. 安装依赖环境 在线安装依赖环境&#xff1a; yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz2. 安装Erlang 根据课…

[原创]集权设施保护之LDAP协议

LDAP是一种目录访问协议&#xff0c;它规定了以树状结构的方式来存储和访问数据。然而协议是抽象的&#xff0c;要产生具体的功效&#xff0c;必须在应用中实现&#xff0c;比如AD域服务就实现了LDAP协议。 LDAP最明显的优势就是读取速度快&#xff0c;拥有极高的搜索效率。 可…

Drools规则引擎

Drools规则引擎 Drools规则引擎1、Drools简介2、Drools入门案例2.1、业务场景2.2、maven坐标2.3、编写xml配置文件&#xff08;多方法&#xff09;2.4、创建drl规则文件2.5、单元测试 3、Drools基础语法3.1、规则文件的构成3.2、规则体语法结构3.2.1、条件部分3.2.1.1、约束连接…

day4,day5 -java集合框架

List、Set、Map等常用集合类的特点和用法。 常用集合类&#xff08;List、Set、Map 等&#xff09;是 Java 中提供的数据结构&#xff0c;用于存储和操作一组数据。以下是它们的特点和用法&#xff1a; List&#xff08;列表&#xff09;: 特点&#xff1a;有序集合&#xff0…

多元办公场景下,企业如何保障工作效率与数据安全流通?

为适应数字化转型需求&#xff0c;提升办公效率&#xff0c;很多企业对工作模式进行革新&#xff0c;并将更多协同办公工具引入工作流程。然而&#xff0c;这也扩大了企业内网对外的安全暴露面&#xff0c;企业亟需进一步加强底层基础设施的网络安全建设&#xff0c;严防勒索病…

分布式监控平台——Zabbix6.0

市场上常用的监控软件&#xff1a; 传统运维&#xff1a;zabbix、 Nagios云原生环境&#xff1a; Prometheus &#xff08;go语言开发的&#xff09; 一、zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数…

内网渗透(八十六)之Exchange ProxyLogon攻击链利用

Exchange ProxyLogon攻击链利用 漏洞背景 2021年3月2日,微软发布了Exchange服务器的紧急安全更新,修复了如下7个相关的漏洞。 Exchange服务端请求伪造漏洞(CVE-2021-26855):未经身份验证的攻击者能够构造HTTP请求扫描内网并通过Exchange服务器进行身份验证。Exchange反序列…

基于SpringBoot的财务管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;…

王石创立“生物圈三号”发起“双碳同行者大会”,绿色家居企业参与其中

2023年5月27日 &#xff0c;由万科集团创始人、深石集团创始人王石先生创立的碳中和社区品牌“生物圈三号”在深圳大梅沙成功举办了“回归未来双碳同行——生物圈三号双碳同行者大会暨全球运河穿越新书发布会”。 生物圈三号作为社区碳中和综合解决方案平台&#xff0c;为建筑、…

JVM-基础知识

JVM基础知识 JVM结构图 字节码文件 Java虚拟机不和包括Java在内的任何语言绑定,它只与字节码文件这种特定的二进制文件格式所关联. Class文件结构不仅仅是JVM的执行入口,更是Java生态圈的基础和核心. 字节码文件内容是什么 字节码是一种二进制的类文件,他的内容是JVM指令,而…

OpenAI竞对再被谷歌加注!4.5亿美元新融资到位,累计已吸金14.5亿美元

量子位 | 公众号 QbitAI OpenAI之外&#xff0c;第二不差钱的AI初创公司出现了&#xff01; 研发出ChatGPT最强竞品Claude的Anthropic公司&#xff0c;在谷歌投资之后&#xff0c;再次官宣获得了4.5亿美元C轮融资。 这轮收购之后&#xff0c;Anthropic资金一跃达到14.5亿美元…