转载出处:http://ajoo.iteye.com/blog/735368

花开花落,花落花开。少年子弟江湖老,红颜少女的儿子都会打酱油反三俗了.

蓦然回首, 那个仿佛刚刚还在上幼儿园, 拉着我的手让我带着到麦当劳买鸡块冰激凌吃的小屁孩儿; 上了小学, 抱着我给买的盗版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呢? 这样吧?

Java代码  
  1. List<String> list = new ArrayList<String>();

怎么new一个HashMap呢? 是不是这样?

Java代码  
  1. Map<String, Integer> map = new HashMap<String, Integer>();

对俺们这些用惯了瓜娃的懒人, 写那个<>里面的东东两次就觉得累得慌, 除非一些特殊的场合不想依赖瓜娃的jar文件的, 俺们一般都改写成:

Java代码  
  1. List<String> list = Lists.newArrayList();
Java代码  
  1. Map<String, Integer> list = Maps.newHashMap();

Lists和Maps是两个工具类,  Lists.newArrayList() 其实和new ArrayList()几乎一模一样, 唯一它帮你做的(其实是javac帮你做的), 就是自动推导(不是"倒")尖括号里的那坨叉叉.

这两个东西要说技术含量, 附加价值差不多趋近于0. 但是越是这种简单的不用脑子的东西, 越是让人惊讶地有邪异的吸引力. 我就看过好几个人说, 他们使用瓜娃的主要目的, 就是newArrayList()和newHashMap(). 毕竟, 这东西每个人每时每刻差不多都要用到吧?

当然, 瓜娃提供的远不止这两毛五, 买一根小豆冰棍儿都不够. 比如, 除了new一个空的ArrayList, 你还想往里放点数据. 直接用jdk的话, 大概是这样:

Java代码  
  1. List<Integer> list = new ArrayList<Integer>();
  2. list.add(1);
  3. list.add(2);
  4. list.add(3);

用Lists是这样:

Java代码  
  1. List<Integer> list = Lists.newArrayList(1, 2, 3);

嗯, 是不是有点意思了? 值一个"可爱多"了吧?

二. ImmutableList和ImmutableMap

现在主流java社区倾向于同意, immutable对象(就是说状态不变)是个好东西. 它能让程序逻辑变得简单易懂, 而且减少出错的可能性.

JDK目前不提供immutable集合. 瓜娃提供的最主要的immutable集合, 是ImmutableList, ImmutableSet和ImmutableMap. 
顾名思义, 一旦你创建了一个ImmutableList或者ImmutableMap, 你就再也不能改变它了. 它就像你记忆中初恋的那个她, 不管时光荏苒, 沧海桑田, 永远年轻美丽语笑嫣然 --- 当然, 前提是你还活着.

那么怎么创建ImmutableList呢? 嗯, 除非语言直接提供支持, 这应该是最简单的方式了:

Java代码  
  1. ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);

ImmutableMap一样简单:

Java代码  
  1. ImmutableMap<String, Integer> map = ImmutableMap.of(
  2. "1", 1,
  3. "2", 2,
  4. "3", 3
  5. );

对比一下用HashMap的情况:

Java代码  
  1. Map<String, Integer> map = new HashMap<String, Integer>();
  2. map.put("1", 1);
  3. map.put("2", 2);
  4. map.put("3", 3);

还是前者舒服吧?

那么, 假设你所有的不是事先知道的一些常量. 比如说, 你要从一个数据库里读出一些基本信息保存在内存里. 用of()就不好使了, 这时候, 可以用builder模式:

Java代码  
  1. ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
  2. for (...) {
  3. builder.put(name, age);
  4. }
  5. ImmutableMap<String, Integer> map = builder.build();

ImmutableList和ImmutableMap最常用的就是创建一些集合常量 (这些常量都是static final的).

另外一个主要的用途, 是作为其它Immutable对象内部使用的数据结构.

三. 讨论

一个也许会存在争议, 但是瓜娃开发组强烈推荐的使用方法, 是凡是可能的情况下, 给你的函数的返回类型用ImmutableList和ImmutableMap, 而不是它们实现的接口: List和Map. 比如:

Java代码  
  1. ImmutableList<String> getNames();
  2. ImmutableMap<String, Integer> getAgeMap();

而不是:

Java代码  
  1. List<String> getNames();
  2. 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可能是可变的也可能是不可变的. 大概还是不要钻牛角尖, 入乡随俗吧.

Guava(一)Lists与Maps相关推荐

  1. Guava入门~Lists

    import java.util.List; import org.hamcrest.CoreMatchers; import org.junit.Assert; import com.google. ...

  2. 瓜娃之走马观花 (1) - List和Map

    2019独角兽企业重金招聘Python工程师标准>>> 序 花开花落,花落花开.少年子弟江湖老,红颜少女的儿子都会打酱油反三俗了. 蓦然回首, 那个仿佛刚刚还在上幼儿园, 拉着我的手 ...

  3. 面试官系统精讲Java源码及大厂真题 - 14 简化工作:Guava Lists Maps 实际工作运用和源码

    简化工作:Guava Lists Maps 实际工作运用和源码 更新时间:2019-09-24 10:32:00 如果不想在世界上虚度一生,那就要学习一辈子. 引导语 在日常工作中,我们经常会使用一些 ...

  4. Guava学习笔记:EventBus(转)

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...

  5. Google Guava介绍

    Google Guava介绍 Google Guava是Google的java项目广泛依赖的核心库,其功能强大并且高效稳定,我们日常企业开发或学习也可以参考和借鉴Guava.其对集合Collectio ...

  6. 小程序使用sass_如何使用Sass Maps生成所有实用程序类

    小程序使用sass by Sarah Dayan 通过莎拉·达扬 如何使用Sass Maps生成所有实用程序类 (How to generate all your utility classes wi ...

  7. java 合并 set_【Java必修课】各种集合类的合并(数组、List、Set、Map)

    1 介绍 集合类可谓是学习必知.编程必用.面试必会的,而且集合的操作十分重要:本文主要讲解如何合并集合类,如合并两个数组,合并两个List等.通过例子讲解几种不同的方法,有JDK原生的方法,还有使用第 ...

  8. java集合合并_【Java必修课】各种集合类的合并(数组、List、Set、Map)

    1 介绍 集合类可谓是学习必知.编程必用.面试必会的,而且集合的操作十分重要:本文主要讲解如何合并集合类,如合并两个数组,合并两个List等.通过例子讲解几种不同的方法,有JDK原生的方法,还有使用第 ...

  9. Java研发团队高效能规范

    目前大部分团队是使用的阿里巴巴Java开发规范,不过在日常开发中难免遇到覆盖不到的场景,本文在阿里巴巴Java开发规范基础上,补充一些常用的规范,用于提升代码质量及增强代码可读性. 编程规约 1.基础 ...

最新文章

  1. 哥们,你侵权了,哥有权告你去!
  2. 计算机网络---个人笔记整理
  3. iOS进阶之类别(Category)(9)
  4. 零基础学python用什么书-零基础自学python3 好用的入门书籍推荐
  5. STL 之vector详解
  6. 完美安装ubuntu
  7. ubuntu 14.04 下 安装samba 及SSH 服务端的方法
  8. ipq806X的猜想
  9. 模糊控制洗衣机c语言程序,模糊控制洗衣机
  10. struts2和hibernate的简单新闻发布系统_点赞!北斗卫星导航系统28nm工艺芯片已量产,全球范围定位精度优于10米...
  11. Android 百度地图SDK 自动定位、标记定位
  12. 智能语音小夜灯 开灯关灯只需要说一声!#懒人必备神器
  13. mysql 用户名 长度_一个 MySQL 用户名长度的坑
  14. OA是什么意思?什么是OA? OA系统是什么?
  15. 玩转树莓派 —智能家居(语音控制电器开关 及语音模块的二次开发)
  16. gic lpi its
  17. Java byte[]与short[]之间转换
  18. 嵌入式(stm32)学习之路---MIDI音乐播放器
  19. 运维工程师和实施工程师的区别
  20. 牛客练习赛87 B k小数查询(STL)

热门文章

  1. DECODE函数和SIGN函数详解
  2. 利用消球差透镜对各种偏振光束进行深聚焦
  3. android手机怎样开启usb调试模式,智能手机usb调试在哪_usb调试模式怎么打开
  4. 什么是内联元素(行内)
  5. css 块级元素与内联元素
  6. python调用接口返回401_python接口测试之401错误的分析和解决(十六)
  7. 修模界的“神器”模方 | 视图裁切、底灰修复、区域选取、联动质检——让修模更高效
  8. python爬虫---mechanize
  9. 重定向和转发的区别?
  10. 绝望!新 AlphaGo 放弃人类,柯洁:人类太多余了