开源工具系列文章:
Apache Commons Lang(1):http://ray-yui.iteye.com/blog/1953020
Apache Commons Lang(2):http://ray-yui.iteye.com/blog/1958319
Apache Commons BeanUtils:http://ray-yui.iteye.com/blog/1961451
Apache Commons Collections:http://ray-yui.iteye.com/blog/2021484
Apache Commons IO:http://ray-yui.iteye.com/blog/2023034
程序=算法+数据结构,所以基本开源组织无论是Spring,Apache等都有他们各自对Collections的扩展,而这些扩展有时候能帮助到我们业务上的问题
public class TestMain { public static void main(String[] args) { /* * Bag 是Collection的其中一种实现,使用起来也像List, * 但它能容纳重复的元素,与List的最大区别是他提供了重复元素的統計功能, * 但却剥夺了获取某一元素的功能(get方法),以下例子为统计集合中元素个数 */ Bag bag = new HashBag(Arrays.asList("Hello", "World", "Wolrd", "Hello")); // 增加3个Hello bag.add("Hello", 3); // bag没有get方法,只有getCount bag.getCount("Hello"); // 可以使用uniqueSet方法返回不重复的Set bag.uniqueSet(); /* * BidiMap,是双向Map,可以通过key找到value, * 也可以通过value找到key,需要注意的是BidiMap * 当中不光key不能重复,value也不可以。 */ BidiMap bidiMap = new DualHashBidiMap(); bidiMap.put("Hello", "World"); bidiMap.put("Hello1", "World1"); bidiMap.get("Hello"); // <--通过key获取value bidiMap.getKey("World1");// <--通过value获取key /* * MultiMap 单个key指向多个对象,就是单个key可以对应多个value, * 在put或remove时和普通Map没有区别,但当get时将返回多个value, * 所以返回一个collections,利用MultiMap,我们就可以很方便的往 一个 * key上放数量不定的对象,也就实现了一对多,在3.2.1版本中MultiHashMap已被废除, * 请使用MultiValueMap */ MultiMap multiMap = new MultiValueMap(); multiMap.put("Hello", "World"); multiMap.put("Hello", "World1"); multiMap.put("Hello", "World2"); // worldList[World,World1,World2] List<String> worldList = (List<String>) multiMap.get("Hello"); /* * LazyMap.类似与Hibenrate的懒加载,在声明的时候并不会创建, * 而是在使用(get)的时候,才创建集合的内容,返回Factory的返回值 * 实现懒加载,有LazyList与LazyMap对应 */ Map lazy = LazyMap.decorate(new HashMap(), new Factory() { @Override public Object create() { return "World"; } }); String hello = (String) lazy.get("Hello"); } }
Apache commons中还有ListUtils,MapUtils等工具类,但笔者并没有使用过,有兴趣的读者可自行参考API,笔者认为,在面向对象开发当中,数据不应该再依赖集合类来组织,笔者曾经见过List<Map<String,Map<String,Object>>>这样的数据结构声明,笔者有莫名的冲动想在旁边注释一句WTF,有考虑过别人阅读代码的感受吗?能否抽象出类来组织你需要的数据?所以我们不应该过份的依赖数据结构来组织数据,特别在面向对象的开发当中