序
花开花落,花落花开。少年子弟江湖老,红颜少女的儿子都会打酱油反三俗了.
蓦然回首, 那个仿佛刚刚还在上幼儿园, 拉着我的手让我带着到麦当劳买鸡块冰激凌吃的小屁孩儿; 上了小学, 抱着我给买的盗版commando苦苦钻研攻略的小表弟, 开始写java程序了!
暑假去小表弟学校宿舍晃了一下. 书桌上随手堆着的可乐矿泉水瓶; 书桌下凌乱的鞋子, 鼠标; 寝室门上的个性标语; 隔壁在炎夏里半裸着看片子(木有看清是女主是否半裸)的猥琐男生, 都让俺情不自禁地小资起来: 唉, 世界是你们的了!
唯一地遗憾是没有重温一下女生寝室的风光 --- 上了年纪了, jailbreak门口大妈的身手不再了呀!
小兄弟是个努力的好童鞋. 于是咱自然当仁不让开始介绍UML, SOA, 4GL, J2EE, Agile Programming, JSR168X --- 噢, 不好意思, 又不小心yy了, 俺是粗淫, 这些说实话不懂地.
咳嗽, 是介绍JUnit, TDD, 和瓜娃 --- 就是Google Collection的重装上阵:
Guava.
一. Lists和Maps
介绍瓜娃主要是觉得它是个老老实实的能帮助写代码的工具库. 不用把它当作正儿八经的什么东西学习 (说实话, 那里面的东西俺估计也就接触过两成了不起了), 把那个jar文件放到你的classpath里, 然后哪怕你就知道一个库函数呢, 对景的时候也是个帮手啊.
比如, 最简单地, 用java5以上的话(2010年了, 还在用上古神器jdk1.3或者1.4的首长请举手. 敬礼! 首长辛苦了!), 你怎么new一个ArrayList呢? 这样吧?
List<String> list = new ArrayList<String>();
怎么new一个HashMap呢? 是不是这样?
Map<String, Integer> map = new HashMap<String, Integer>();
对俺们这些用惯了瓜娃的懒人, 写那个<>里面的东东两次就觉得累得慌, 除非一些特殊的场合不想依赖瓜娃的jar文件的, 俺们一般都改写成:
List<String> list = Lists.newArrayList();
Map<String, Integer> list = Maps.newHashMap();
Lists和Maps是两个工具类,
Lists.newArrayList()其实和new ArrayList()几乎一模一样, 唯一它帮你做的(其实是javac帮你做的), 就是自动推导(不是"倒")尖括号里的那坨叉叉.
这两个东西要说技术含量, 附加价值差不多趋近于0. 但是越是这种简单的不用脑子的东西, 越是让人惊讶地有邪异的吸引力. 我就看过好几个人说, 他们使用瓜娃的主要目的, 就是newArrayList()和newHashMap(). 毕竟, 这东西每个人每时每刻差不多都要用到吧?
当然, 瓜娃提供的远不止这两毛五, 买一根小豆冰棍儿都不够. 比如, 除了new一个空的ArrayList, 你还想往里放点数据. 直接用jdk的话, 大概是这样:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
用Lists是这样:
List<Integer> list = Lists.newArrayList(1, 2, 3);
嗯, 是不是有点意思了? 值一个"可爱多"了吧?
二. ImmutableList和ImmutableMap
现在主流java社区倾向于同意, immutable对象(就是说状态不变)是个好东西. 它能让程序逻辑变得简单易懂, 而且减少出错的可能性.
JDK目前不提供immutable集合. 瓜娃提供的最主要的immutable集合, 是ImmutableList, ImmutableSet和ImmutableMap.
顾名思义, 一旦你创建了一个ImmutableList或者ImmutableMap, 你就再也不能改变它了. 它就像你记忆中初恋的那个她, 不管时光荏苒, 沧海桑田, 永远年轻美丽语笑嫣然 --- 当然, 前提是你还活着.
那么怎么创建ImmutableList呢? 嗯, 除非语言直接提供支持, 这应该是最简单的方式了:
ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);
ImmutableMap一样简单:
ImmutableMap<String, Integer> map = ImmutableMap.of(
"1", 1,
"2", 2,
"3", 3
);
对比一下用HashMap的情况:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
还是前者舒服吧?
那么, 假设你所有的不是事先知道的一些常量. 比如说, 你要从一个数据库里读出一些基本信息保存在内存里. 用of()就不好使了, 这时候, 可以用builder模式:
ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
for (...) {
builder.put(name, age);
}
ImmutableMap<String, Integer> map = builder.build();
ImmutableList和ImmutableMap最常用的就是创建一些集合常量 (这些常量都是static final的).
另外一个主要的用途, 是作为其它Immutable对象内部使用的数据结构.
三. 讨论
一个也许会存在争议, 但是瓜娃开发组强烈推荐的使用方法, 是凡是可能的情况下, 给你的函数的返回类型用ImmutableList和ImmutableMap, 而不是它们实现的接口: List和Map. 比如:
ImmutableList<String> getNames();
ImmutableMap<String, Integer> getAgeMap();
而不是:
List<String> getNames();
Map<String, Integer> getAgeMap();
为什么这样呢? 这是因为immutable集合是一类特殊集合, 它们不象ArrayList, HashMap那样是纯粹的实现细节, 相反, 这些类型携带了重要的语义信息: 它们是不可变的.
如果调用者使用了list.add()或者map.put(), 得到的将是UnsupportedOperationException异常.
通过返回ImmutableMap和ImmutableList, 函数签名清楚地告诉调用者什么可以做, 什么不可以做. 这对大型程序中团队协作, 代码理解和维护好处多多.
实际上, 最有争议的, 是在jdk的集合框架设计上. Sun把List和Map的接口设计为mutable(可变的), 但是同时允许实现类不实现某些函数, 比如add(), put(). 一些貌似爱思考地程序员(包括俺)就想啦: 为啥你不干脆把写操作分离出来呢? 这样当一个人拿到ImmutableList的时候, 他根本就没有add()可以调用, 更甭说运行时抛异常了?
Sun对此专门有个
回答. 是否信服就由你了. 不过不管喜不喜欢, 我们今天所有的就是这个设计: 一个List可能是可变的也可能是不可变的. 大概还是不要钻牛角尖, 入乡随俗吧.
未完待续
分享到:
相关推荐
第1讲-引论-走马观花看导论.pptx
本实例针对初学。简洁,易懂,程序可以用来作模板。。希望我的作品,能成为你的作品。
关于走马观花灯的单片机实训报告概要.pdf
Java程序设计高晓黎走马观花看PPT教案学习.pptx
八年级地理下册 第七章 第二节 澳门特别行政区的旅游文化特色 知识拓展 走马观花澳门博彩业素材 湘教版.doc
01.两数之和 02.两数相加 03.无重复字符的最长子串 05.最长回文子串 06.Z字型变换 07.整数反转 08.字符串转换整数 09.回文数 10.正则表达式匹配 11.盛最多水的容器 12.整数转罗马数字 13.罗马数字转整数 14.最长公共...
花了一个周末的时间把它走马观花的学习了一下,顺便将官方的指南翻译了出来,这个应该是最新的---其他地方还没发现有! 首先申明,哥们儿英语高中水平,借助了必应词典勉强将其意译了出来,如果你发现翻译中有纰漏,...
Flex从入门到实践——源代码(11章)
智能时代读书心得1 这本书内容比较浅,基本属于讲故事、走马观花的那种。作者文笔、见识、阅历是很牛,本书没有体现出来。 唯一觉得亮点的地方在于,以前不太知道大数据和人工智能具体关系,这本书简单地讲解了一下...
象以后我门在学习JAVA 的时候,一定要对每个知识点要慢慢的消化吃透,切不能走马观花。一个知识点必须要反复的动手练习,不然很难理解其中的奥秘所在的! 5.在JAVA的程序中,我经常性的看到字符前面有@这种标志的...
《perl语言入门》也就是大家所称道的“小骆驼书”,是perl程序设计人员最为仰赖的启蒙读物之一。自1993年以来,这本书就成为热卖的perl语言教学材料,而此次新版又涵盖了perl 5.10的最新变化。本书的诸位作者自1991...
20世纪,随着计算机科学的发展,数据库技术在Internet 中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。个性化已逐渐成为当今Wed应用的潮流。本文研究了一种基于数据关联规则采集技术的用户个性化...
我建议大家不妨先看看原理图,再对照电路板实物,把整个电路简单的消化一下,并且弄清楚板载跳线、电源插座等的具体用法和注意事项,免得上演“高压冒烟”的惨剧。
05课系统功能部分比较大,做了分包,请下载两个一起解压,第二部分不收费哦! 本教程是本人在学习JAVA【Android开发】时候珍藏的视频,视频...不要走马观花,一路快进,编程没有捷径,有时候你一个快进,就错过了重点
但二进制文件太多,核心代码都没没在大量细节实现中,全部看完不现实,走马观花又很难领会精髓;纸上得来终觉浅,眼过千遍,不如手过一遍,干脆重新造个轮子;于是就有了mini-rails,参照Rails原始码,省略细节,...
调研时间 2011年9月10日--9月30日 一、计算机和信息技术在我县中小学中应用的现状 1、中小学干部、教师对应用计算机和信息技术有了初步的认识 部分学校的领导和教师开始重视现代教育技术在教学中的应用,看到了...
此外,考生应该注意定位原文的过程中,一定要脑、眼和手并用:眼是肯定要用的,不用脑会导致忽视同义转换,不用手(笔)会使我们处于走马观花的状态,然后会怀疑自己是不是漏掉了信息而不停地看。 技巧三:“吃透”...
走马观花式的旅游将逐渐被淘汰,取而代之的是长时间、高参与度的文化沉浸。 科技与文化游的结合将成为新亮点,例如,虚拟现实、增强现实等技术将为游客带来更加丰富和立体的文化体验,甚至可能重构某些已经消失的...
在互联网中,商业网站成千上万,浏览者常常是走马观花,一带而过,只有精彩、内容极其丰富新颖的网站,能吸引住浏览者。这种结果首先要归功于网站的规划和设计者。独具匠心的网站规划设计就像一幢宏伟的建筑前期的...
应用方案 目 录 3 二、市场需求分析 5 三、技术介绍 6 ...许多游客和参观人士,在游览和观赏过程中,由于不了解景物和展品丰富的文化内 涵,对众多本该驻足观赏、细细品味的人文、历史景观等往往是走马观花、视而不见!