`
ray_yui
  • 浏览: 216682 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

开源工具 — Apache Commons Collections

阅读更多

开源工具系列文章:
      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,有考虑过别人阅读代码的感受吗?能否抽象出类来组织你需要的数据?所以我们不应该过份的依赖数据结构来组织数据,特别在面向对象的开发当中
14
5
分享到:
评论
8 楼 string2020 2015-08-06  
List<Map<String,Map<String,Object>>>
这种,没什么,我经常用
7 楼 xiaosheng12345 2014-02-26  
对于楼主的红字,我写过,是在后台数据转json字符串,传到前台时的操作. 我觉得对于这种结构,能跟json串的结构差不多, 也能更好的拼装json串吧.至于抽象出对象来,我没考虑过,的确,好几层循环挺恶心人.
6 楼 wangyang_cx 2014-02-26  
Apache Commons Collections不支持泛型,或许1.6+获取用guava更好
5 楼 uniqueX 2014-02-26  
bitray 写道
lucky16 写道
很有必要抽象出来,大系统中这样对后期维护和功能改造也会好很多,
多重构重构,不能只看眼前的方便。

我感觉重构还是一个度量衡问题。什么为度,过度重构其实也没什么意义。多增加一个类既不提升性能也未必明了多少。可能就是一个中间变量的东西,我估计一个开发者看这个数据结构+debug数据,都可以看出来。我个人建议是抽象和重构必须重构的,如果意义不大的部分,尽量拍后。
注释什么的写明白我看就很有必要了

楼主文章中展示的数据结构,要拼凑这样的结构3个嵌套循环是少不了的.抽出对象能那就不用嵌套循环,加强了效率和可读.
4 楼 bitray 2014-02-25  
lucky16 写道
很有必要抽象出来,大系统中这样对后期维护和功能改造也会好很多,
多重构重构,不能只看眼前的方便。

我感觉重构还是一个度量衡问题。什么为度,过度重构其实也没什么意义。多增加一个类既不提升性能也未必明了多少。可能就是一个中间变量的东西,我估计一个开发者看这个数据结构+debug数据,都可以看出来。我个人建议是抽象和重构必须重构的,如果意义不大的部分,尽量拍后。
注释什么的写明白我看就很有必要了
3 楼 uniqueR 2014-02-25  
非常赞同红字
2 楼 lucky16 2014-02-25  
很有必要抽象出来,大系统中这样对后期维护和功能改造也会好很多,
多重构重构,不能只看眼前的方便。
1 楼 bitray 2014-02-25  
多创建一个类有时候很麻烦耶,可能就一个小模块,很少人去用的地方,这个问题不大

相关推荐

Global site tag (gtag.js) - Google Analytics