首页 > 其他分享 >5个guava值得留意的用法

5个guava值得留意的用法

时间:2022-12-08 13:06:43浏览次数:72  
标签:字符 匹配 留意 sequence CharMatcher 用法 CharSequence JAVA guava


在http://blog.takipi.com/google-guava-5-things-you-never-knew-it-can-do/中,
提到了5个guava值得留意的用法,其中个人认为有4个还是不错的,值得留意

1 哈希功能
Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换。此外,使用Java内建方法实现的散列码通常是劣质的,部分是因为它们最终都依赖于JDK类中已有的劣质散列码。

Object.hashCode往往很快,但是在预防碰撞上却很弱,也没有对分散性的预期。这使得它们很适合在散列表中运用,因为额外碰撞只会带来轻微的性能损失,同时差劲的分散性也可以容易地通过再散列来纠正(Java中所有合理的散列表都用了再散列方法)。然而,在简单散列表以外的散列运用中,Object.hashCode几乎总是达不到要求——因此,有了com.google.common.hash包。

散列包的组成
在这个包的Java doc中,我们可以看到很多不同的类,但是文档中没有明显地表明它们是怎样 一起配合工作的。在介绍散列包中的类之前,让我们先来看下面这段代码范例:


HashFunction hf = Hashing.md5();


HashCode hc = hf.newHasher()


.putLong(id)


.putString(name, Charsets.UTF_8)


.putObject(person, personFunnel)


.hash();

HashFunction


HashFunction是一个单纯的(引用透明的)、无状态的方法,它把任意的数据块映射到固定数目的位指,并且保证相同的输入一定产生相同的输出,不同的输入尽可能产生不同的输出。

Hasher

HashFunction的实例可以提供有状态的Hasher,Hasher提供了流畅的语法把数据添加到散列运算,然后获取散列值。Hasher可以接受所有原生类型、字节数组、字节数组的片段、字符序列、特定字符集的字符序列等等,或者任何给定了Funnel实现的对象。

Hasher实现了PrimitiveSink接口,这个接口为接受原生类型流的对象定义了fluent风格的API

Funnel

Funnel描述了如何把一个具体的对象类型分解为原生字段值,从而写入PrimitiveSink。比如

Funnel<Person> personFunnel = new Funnel<Person>() {

@Override

public void funnel(Person person, PrimitiveSink into) {

into

.putInt(person.id)

.putString(person.firstName, Charsets.UTF_8)

.putString(person.lastName, Charsets.UTF_8)

.putInt(birthYear);

}

};




2 域名校验功能:

InternetDomainName owner =
InternetDomainName.from("blog.takipi.com").topPrivateDomain(); // returns takipi.com

InternetDomainName.isValid(“takipi.monsters"); // returns false



3 找出包或工程下的所有类 ClassPath


ClassPath classpath = ClassPath.from(classloader);
for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses("com.mycomp.mypackage")) {
System.out.println(classInfo.getName());
}


上面的代码就可以找出某个包下的所有类了


4


CharMatcher功能


CharMatcher提供了多种对字符串处理的方法, 它的主要意图有:


1. 找到匹配的字符


2. 处理匹配的字符



CharMatcher 的内部实现主要包括两部分:


1. 实现了大量公用内部类, 用来方便用户对字符串做匹配: 例如 JAVA_DIGIT 匹配数字, JAVA_LETTER 匹配字母等等。


2. 实现了大量处理字符串的方法, 使用特定的CharMatcher可以对匹配到的字符串做出多种处理, 例如 remove(), replace(), trim(), retain()等等。



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


3、一些栗子:



(1)使用预定义的常量 (predefine CharMatcher):



CharMatcher.WHITESPACE (Java whitespace character)


CharMatcher.JAVA_DIGIT


CharMatcher.JAVA_LETTER


CharMatcher.JAVA_LOWER_CASE


CharMatcher.JAVA_UPPER_CASE


CharMatcher.ASCII


CharMatcher.ANY


...




String str = "FirstName LastName +1 123 456 789 !@#$%^&*()_+|}{:\"?><";



CharMatcher.JAVA_LOWER_CASE.negate().retainFrom(str);


Output:->


"FN LN +1 123 456 789 !@#$%^&*()_+|}{:\"?><"



CharMatcher.JAVA_DIGIT.or(CharMatcher.anyOf("aeiou")).retainFrom(str);


Output:->


"iaeaae1123456789"


(3)一些小例子:




?



//原字符串


System.out.println(string);



//去掉控制字符(\t,\n,\b...)


System.out.println(CharMatcher.JAVA_ISO_CONTROL.removeFrom(string));



//获取所有的数字


System.out.println(CharMatcher.DIGIT.retainFrom(string));



//把多个空格替换为一个包括\t,并去掉首位的空格


System.out.println(CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' '));



//把所有的数字用"*"代替


System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom(string, "*"));



//获取所有的数字和小写字母


System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string));



//获取所有的大写字母


System.out.println(CharMatcher.JAVA_UPPER_CASE.retainFrom(string));



//获取所有单字节长度的符号


System.out.println(CharMatcher.SINGLE_WIDTH.retainFrom(string));



/*


原字符串:


ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES



去掉控制字符(\t,\n,\b...):


ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好234啊 GES



获取所有的数字:


23234



把多个空格替换为一个包括\t,并去掉首位的空格:


ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES



把所有的数字用"*"代替:


ROCKY rocky RoCkY ~!@#$%^&*() **(*&gS 你好 ***啊 GES



获取所有的数字和小写字母:


rockyok23g234



获取所有的大写字母:


ROCKYRCYSGES



获取所有单字节长度的符号:


ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 234 GES


*/


(4)用正则作为匹配、判断条件



需要说明的是 CharMatcher 并没有提供以正则表达式作为匹配条件的方法,



你可以参考:



​http://stackoverflow.com/questions/12378702/how-to-write-the-charmatcher-equivalent-for-the-regex-word-character ​

七种武器:Collection 之 Google Guava



不过这个例子貌似只能判断字符,而不是字符串。



但是这难不倒我们,别忘了在上篇文章的最后的链接里,我提到了另一个与 guava 类似的库:Apache Commons,相对而言,它的功能更加完善,比如,这个需求,它内置了一个专门的校验类:Validate




try {


Validate.matchesPattern("2013-11-241", "\\d{4}-\\d{2}-\\d{2}", "输入的日期格式不正确!");


} catch (Exception e) {


System.out.println(e.toString());


// return;


}



// output:


// java.lang.IllegalArgumentException: 输入的日期格式不正确!

标签:字符,匹配,留意,sequence,CharMatcher,用法,CharSequence,JAVA,guava
From: https://blog.51cto.com/u_14230175/5920958

相关文章

  • (转)Guava 是个风火轮之基础工具(1)
    前言Guava是Java开发者的好朋友。虽然我在开发中使用Guava很长时间了,GuavaAPI的身影遍及我写的生产代码的每个角落,但是我用到的功能只是Guav......
  • Google Guava提供的特殊的Table集合
    1、Table是个啥?是一个特殊的映射,其中两个键可以在组合的方式被指定为单个值。它类似于创建映射的映射。当你想使用多个键做索引的时候,你可能会用类似Map<rowKey,Map<c......
  • lightdb vacuum用法--功能与参数
    lightdb没有像Oracle那样的undo来存放旧版本;而是将旧版本直接存放于relation文件中。那么带来的问题就是deadtuple过多,导致relation文件不断增大而带来空间膨胀问题。......
  • Networkx用法例子总结
    获得k-hop子图subgraph=nx.ego_graph(G,node,radius=k)neighbors=list(subgraph.nodes())可视化并对目标节点高亮#generatenodepositions:pos=nx.spring......
  • sql分组,排序等一些函数的用法
    今天项目的两个地图数据有问题,经检查是由于数据重复造成的,需要去重,解决问题后把使用的相关函数汇总一下   group by是分组函数,partition by是分区函数(像sum()等......
  • matlab 中@的用法
    参数传递和指定函数表达式1参数传递@适用于定义函数句柄的操作符。h=@cos>>h(pi)ans=-12指定函数表达式用法:函数句柄=@(输入参数列表)运算表达式产......
  • Java—Google guava工具类(高效)快速入门指南
    Java—Googleguava工具类(高效)快速入门指南Googleguava工具类特点Guava是对JavaAPI的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava......
  • Java 枚举(enum) 详解7种常见的用法
    Java枚举(enum)详解7种常见的用法常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了......
  • [转]C#zegraph用法
    zegraph是一个免费的图表控件,可用于实现一些折线图、柱状图等图表功能 一、引用usingZedGraph;在资源管理器中点击引用,将ZedGraph.dll添加到工程项目中。二......
  • SQLSERVER中RANK OVER(PARTITION BY)的用法
    https://blog.csdn.net/weixin_41896770/article/details/107625845一张学生表【姓名、班级、分数】,查询出每个班级成绩排第一的同学(按照班级的分数排名)其中RANK()OVER(......