《Jakarta commons cookbook》学习笔记

[align=center][img]http://images.china-pub.com/ebook30001-35000/32891/shupi.jpg[/img][/align]
关于Jakarta 摘抄维基百科:
[quote]Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它包括了很多子项目。Tomcat、Ant、Struts等等現在是Apache下的开源项目,也曾是Jakarta的关联项目。
Jakarta的名称是想把与Jakarta关系非常深的爪哇岛关联起来。编程语言Java的命名源自这个岛的名字(印尼語:Jawa、英語:Java),而城市雅加达(Jakarta)正是这个岛上的第一大城市,也是印度尼西亚的首府。 [/quote]

Jakarta工具包可谓java开发中的必备神器, 熟悉里面各种工具类的用法, 可以让我们少重复发明一些轮子.它里面的一些commons包也成了很多开源项目的必备依赖. 比如spring, hibernate之流.

这本书讲到了Jakarta中几个比较重要的包的用法, 由于Jakarta中很多工具类的JavaDoc写的非常棒, 因此, 里面大部分工具类我们通过阅读其JavaDoc都应用的得心应手. 而这本书给我的最大体会, 就是发现了Jakarta中更多的宝贝, 而且熟悉了更多的用法. 缺点就是此书有点老了, 而Jakarta发展的太快, 书里面的很多内容在实际的工具包中都对不上号了

[b]Commons Lang [/b]
ToStringBuilder, HashCodeBuilder, EqualsBuilder, CompareToBuilder这些东西做过java的几乎人人都知道了吧
介绍几个很少用的:

[b]ArrayUtils.toString()[/b]
将数组用大括号括起来, 用逗号分隔输出.如果碰到null元素, 将输出unkown字符串. 如果是collection要输出, 可以先toArray()

[b]ArrayUtils.contains()[/b]
检查数组中是否包含指定的元素, indexOf(), lastIndexOf()可以指定元素所在数组的下标

[b]ArrayUtils.toMap()[/b]
将一个二维数组转换成一个map对象.

[b]FastDateFormat[/b]
可以线程安全的实现对日期进行格式化.

[b]DateUtils.round()[/b]
可以将日期时间舍入到最近的日期, 比如DateUtils.round(new Date(), Calendar.Month);将对当前日期中月后面的内容舍弃.DateUtils.SEMI_MONTH, 将日期舍入到一个月的中间和开头.

[b]DateUtils.truncate()[/b]
则类似Math.floor()对指定域(如Calendar.MONTH)之后的内容进行截取处理.

[b]Validate[/b]
用来对方法参数进行验证, 当遇到无效的参数时, 将抛出IllegalArgumentException异常

[b]StopWatch[/b]
用来度量某段代码的执行耗时, 和现实中的秒表有一样的功能, 你可以启动, 停止, 展厅, 恢复计时, 重置以及拆分它. 其中split()/unsplit()方法类似于秒表中的分圈计时.

[b]文本处理 [/b]

[b]StringUtils.abbreviate() [/b]
用于将指定的字符串进行缩减处理, 而且还可以从指定的位置开始缩减.
比如StringUtils.abbreviate("this is a test", 10) 得到的是"this is..."字符串

[b]StringUtils.substringBetween()[/b]
返回被两个指定参数包围起来的字符串内容. 比如将<html>标签包围的内容返回, StringUtils.substringBetween(htmlString, "<html>", "</html>");

[b]StirngUitls.strip()[/b]
可以将字符串中首尾含有指定的内容清除之
比如
StirngUtils.strip("-------****------ABCDE!-------*******-----------", "-*")
得到的是"ABCDE!"

[b]StringUtils.chomp()[/b]
取出字符串末尾的回车换行符, 当然可以指定删除最后的那个字符

String stars = StringUtils.repeat("*", 40); 
String center = StringUtils.center("TEST", 40, "*");
String heading = StringUtils.join(new Object(){stars, center, stars}, "\n");

得到如下字符串
[quote]*****************************
************TEST************
***************************** [/quote]

[b]StringUtils.countMatches()[/b]
返回一段文本在另一段字符串中出现的次数.

[b]StringUtils.deference()[/b]
输出两个字符串之间的差别, indexOfDeference()指出两个字符串之间开始出现差别的位置, getLevenshteinDistance(), 指出从一个字符串转换到另一个字符串需要执行的插入, 删除和替换的次数.

[b]JavaBean [/b]

[b]PropertyUtils.getSimpleProperty()[/b]
通过属性名返回bean属性值

[b]getNestedProperty()[/b]
返回嵌套属性值, 比如getNestedProperty(book, "name.firstName");

[b]getIndexedProperty()[/b]
从数组或List型Bean属性中返回指定的下标元素, 比如getIndexedProperty(book, "chapters[1]");

[b]getMappedProperty()[/b]
从指定map类型的bean属性中返回值, 比如getMappedProperty(apartment, "rooms(dining)");

[b]getProperty()[/b]
可以返回任何属性, 比如 getProperty(country, "regions[0].cities(richmond).population");
[b]
BeanComparator[/b]
用来根据bean属性来排列和比较bean
比如:
Collections.sort(countryList, new BeanComparator("bean"))// 根据国家名称对国家列表进行排序

[b]PropertyUtils.describe()[/b]
可创建一个包含bean实例中所有可读属性的map对象

[b]BeanMap[/b]
可以将一个bean封装成一个通过Map接口来对bean属性进行访问.

[b]DynaBean[/b]
用来在运行时动态创建一个bean.
DynaProperty[] props = new DynaProperty[] { 
new DynaProperty("name", String.class),
};
BasicDynaClass clazz = new BasicDynaClass("book", BasicDynaClass.class, props);
DynaBean bean = clazz.newInstance();
bean.set("name", "macro");


[b]BeanUtils[/b]
以字符串的形式读取和设置bean属性.

[b]函数对象[/b]
用来提供更高级的代码重用性和更简洁的设计, 它用来将功能逻辑从面向特性数据结构的算法中抽象并提取出来.
我们最常用的就是Comparator和Iterator.

[b]ReverseComparator[/b]
用来将Comparator的功能反转, 比如顺序改成倒序

[b]ComparatorChain[/b]
会把连接中的每一个Comparator进行比较, 如果当前Comparator返回值为0, 则调用下一个, 直到连接中没有其他的Comparator.

[b]NullComparator[/b]
对null元素进行排序, 还可以控制null出现在排序的开始还是结尾, 一般NullComparator用来对其他的Comparator进行装饰.

当数组和Collection含有预定顺序关系时, 可使用FixedOrderComparator进行排序, 这种顺序关系包括一周里面星期几的顺序, 太阳系中行星的顺序, 光谱中的颜色顺序.
String[] medalOrder = new String[] {"tin", "bronze", "siliver", "gold"}; 
Comparator medalComparator = new FixedOrderComparator(medalOrder);
Comparator beanComparator = new BeanComparator("medal", medalComparator);
beanComparator.compare(medal1, medal2);


[b]Predicates [/b]
使用Predicate用来评估某个判别式或者条件, Predicate是一种可判别其他对象并返回true或false的对象. 整个Commons Collection都用它来进行筛选, 选择以及验证工作.可以将其理解为对if条件的一种封装, 该接口的唯一方法evaluate()返回true和false.

[b]UniquePredicate[/b]
当对象首次被evaluate时返回true, 该predicate内部维护了一个evaluate对象的HashSet对象, 如果对象已经存在其中, 将返回false. 用来从collection中不重复的获取对象.

Predicate可以用于任何场合, 比如验证用户输入, 筛选collection内容或者用于替换负责的逻辑条件

[b]Transformer [/b]
用来将一个对象为参数, 返回一个经过转换处理后的新的对象

[b]ChainedTransformer[/b]
用来将多个Transformer连接起来.

[b]SwitchTransformer[/b]
实施一个依赖于某Predicate的Transformer. 他能对一个switch进行建模, 并接受三个参数, 一个Predicate数组, 一个Transformer数组, 一个默认的Transformer.两个数组是一一对应的关系, 如果Predicate都不满足则执行默认的Transformer.

[b]Closure [/b]
用来将对某个对象的一段代码进行封装. 比如对某件商品进行打折处理, 可以将打折处理过程封装成一个Closure.

[b]ChainedClosure[/b]
用来将多个Closure进行链接, 与Transformer不同在于, 每个Transformer处理完之后的结果传给下一个Transformer, 而Closure链传递的是同一个对象. 好像轿车通过工厂的流水线一样.

[b]IfClosure[/b]
提供一个Predicate和两个Closure, 如果Predicate判定为true, 执行第一个Closure, 否则执行第二个.

[b]WhileClosure[/b]
用来模拟循环处理, 它需要传递一个Predicate和一个Closure, 如果条件为true, 那么不断执行Closure, 知道条件为false为止.

ForClosure用来执行指定次数的Closure.

[b]Collection[/b]

[b]LoopIterator[/b]
用来重复的便利Collection, 该遍历将永不停止, 因为其HasNext()返回值永远是true, 当用while进行遍历的时候,不要忘记添加退出条件.
对于需要不停的判断一系列取值或者反复执行一组命令时, 使用LoopingIterator就非常合适. 同时它还实现了ResettableIterator接口, 在执行的过程中, 通过执行reset()方法可以跳回到Collection的起始位置.
从只有三项的List中循环取出5项
LoopingIterator itor = new LoopingIterator(list); 
for(int i = 0; i < 5; i++) {
String element = (String)itor.next();
}


[b]ArrayListIterator[/b]
用来遍历ArrayList中指定的部分内容.通过nextIndex()可以获取某个元素的下标.

[b]FilterIterator[/b]
包含了一个Predicate, 如果Predicate为true则该元素将包含在迭代器中. 从来达到遍历某个Collection中合乎特定条件的元素, 或者删除不符合条件的元素.它实际上对指定Iterator的一个装饰而已.

[b]Collections.filter()[/b]
方法用来将不符合条件的元素从Collection中移除, 因此具有破坏性.如果不想破坏原有的Collection, 可以使用CollectionUtils.select()和

[b]CollectionsUtils.selectRejected()[/b]
创建一个含有所有符合或者不符合条件元素的新的Collection.

[b]UniqueFilterIterator[/b]
可以在遍历Collection时跳过重复元素.

[b]Bag[/b]
容器用来对同一个对象存储多次, 并跟踪对象有多少份拷贝.比如某个Bag包含20份A对象的拷贝, 50份B对象的拷贝. Bag有两种, 使用HashMap的HashBag, 具有更高的性能, 还有一种是TreeBag, 它需要维护对象元素加入的顺序.将以加入的顺序返回它们.

[b]Buffer[/b]
分为两种:UnboundedFifoBuffer 无大小限制, BoundFifoBuffer 有大小限制.该容器类似JDK中的Queue, queue中的offer和peek功能与add和remove方法具有相同的功能, 唯一的区别是想Queue中添加数据遇到问题时会抛异常.
还有一种具有优先级的Buffer:PriorityBuffer, 对象会根据Comparator生成的优先级来决定是否被移除. 移除对象的逻辑类似于医院的急诊室工作流程.病情严重的病人将得到优先治疗的权利.这个与PriorityQueue.
BlockingBuffer为阻塞式Buffer.如果系统需要在某段数据就绪时进行处理的话, 就应该使用这种Buffer. 或者系统中有多个进行同时侦听流水线主键缓冲区时, 该数据结构也很管用.JDK5中也有与之对应的BlockingQueue.

[b]MultiMap[/b]
用于给指定的键维护一组值. 当需要一个对象关联多个对象的时候, 使用MultiMap是个好主意.

[b]BidMap[/b]
是这样一种Map实现:当键值都唯一的时候, 可以根据值来查对应的键
DualHashBidMap 把键和值存在两个HashMap中, 其中一个存key-value, 一个存value-key

[b]CaseInsensitiveMap[/b]
key为大小写不敏感String类型的map

[b]PredicateMap[/b]
增加了验证功能的map, 在put一个entry的时候, 如果验证显示为false的话, 将抛出IllegalArgumentException异常.

[b]CollectionUtils.transform()[/b]
该方法接收两个参数, 用来通过Transformer, 将制定的Collection进行转换, 得到一个新的经过转换后的Collection

[b]LRUMap[/b]
一种固定尺寸的Map, 当达到最大容量时会借助最近最少使用算法社区相应的项.

[b]LazyMap[/b]
当根据某个键检索某个值的时候, 将通过指定Transformer, 创建该值.
		Transformer t = new Transformer() {

public Object transform(Object arg0) {
return StringUtils.reverse((String) arg0);
}
};

Map names = new HashMap();

Map lazyMap = LazyMap.decorate(names, t);

Object value = lazyMap.get("MacroChen");
System.out.println(value);

LazyMap的另一个应用场景是通过给定的值从数据库中检索相应的记录.用LazyMap将LRUMap进行包装是一个不错的注意.

[b]CollectionUtils.countMatches(), cardinality()[/b]
用来统计某个对象出现的次数, countMatches()根据Predicate从指定的Collection中返回满足条件的元素数目. 而后者从collection中返回指定对象的数目.

[b]CollectionUtils.union(), intersection(), disjunction(), subtract()[/b]
分别对两个集合进行并集, 交集, 联集和差集.

[b]PropertiesConfiguration[/b]
对Properties的适度增强, 能直接将对应的value转换成相应的类型, 比如以逗号分割的字符串转换成List, 数字字面值转换成数字值.而不是字符串.

[b]Commons Logging[/b]
能在运行时, 通过检测, 能调用相应的日志框架. 比如jdk自带的日志框架和Log4J等.
比如默认情况下, 下面的代码:
public class LoggingTest {
static Log log = LogFactory.getLog("mylog.LogginTest");
public static void main(String[] args) {
log.info(log);
}
}

将返回
[quote]信息: org.apache.commons.logging.impl.Jdk14Logger@83cc67[/quote]
当LogFactory.getInstance()被调用的时候, CommonLogging将通过检测一些系统属性和类路径中库的情况来定位和管理合适的日志框架.
所以如果将log4j加入到类路径之后输出将变成这样:
[quote]log4j:WARN Please initialize the log4j system properly.[/quote]
如果配置了log4j.properties, 那么输出结果可能变成:
[quote]DEBUG (LoggingTest.java:14) org.apache.commons.logging.impl.Log4JLogger@758fc9[/quote]

要显示的将logging设置为使用log4j来做日志输出, 可以通过下面的设置满足要求
System.setProperty("org.apache.commons.logging.Log", "org.apache.commcons.logging.impl.Log4JLogger");


[b]Commons IO[/b]

[b]CopyUtils[/b]
用来将某个InputStream, Reader, byte[]的内容copy到OutputStream或者Writer.

[b]IOUtils.toString()[/b]
用来将信息从Reader或者InputStream中copy到字符串中.

[b]IOUtils.closeQuietly()[/b]
用来只有的关闭某个InputStream, OutputStream, Reader或Writer, 而不用担心null或者IOException, 这个一般放在finally中执行.

[b]FileUtils.byteCountToDisplaySize()[/b]
以KB, MB, GB的形式显示某个文件大小, 该工具类有三个静态变量, ONE_KB, ONE_GB, ONE_MB, 不用大家应该也知道了.另外他不会对文件大小进行四舍五入操作, 比如一个2.9MB的文件, 得到是2MB, 也就是说余数被统统舍弃了.

[b]FileUtils.copyFile(), copyFileToDirectory(), writeStringToFile()[/b]
分别是拷贝文件, 拷贝文件到指定的文件夹, 拷贝字符串内容到文件.

[b]FileUtils.deleteDirectory(), cleanDirectory(), sizeOfDirectory()[/b]
递归删除目录和清空目录下的所有文件, 获取指定目录下所有内容的总大小.

[b]FileUtils.touch()[/b]
类似unix下的touch命令, 如果文件不存在将创建一个新的文件.如果文件存在, 则更新文件的时间戳为当前时间.

[b]IOFileFilter[/b]
关于文件的过滤, 包括FileFilter, FilenameFilter, PrefixFileFilter, SuffixFileFilter, DirectoryFileFilter, 以及AndFileFilter等逻辑过滤器.

[b]CountingInputStream和CountingOutputStream[/b]
用来跟踪进入某个Stream的byte数量.它可以视为是各种Stream的一种装饰器类

[b]TeeOutputStream[/b]
用来将相同的数据发送到两个OutputStream.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值