Guava快速入门

Java诞生于1995年,在这20年的时间里Java已经成为世界上最流行的编程语言之一。虽然Java语言时常经历各种各样的吐槽,但它仍然是一门在不断发展、变化的语言——除了语言本身与JDK在不断的进化,第三方库、框架也同样是日新月异。Guava正是这样一个现代的库,它简单易用,对Java语言是一个非常好的补充,可以说只要你在使用Java语言开发任何项目都应该使用Guava。

1. Guava简介

Java类库中有不少难用的典型,Collection一定是其中之一。Google最早提出Guava库,是对Java Collection进行扩展以提高开发效率。随着时间推移,它已经覆盖到了Java开发的方方面面,在Java 8中,已经可以看到不少API就是从Guava中原封不动的借鉴而来。接下来的几个例子比较了使用Guava和原生JDK的开发:

2. 初始化集合

//JDK
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d"); //Guava
List<String> list = Lists.newArrayList("a", "b", "c", "d");

3. 读取文件内容

//JDK写法冗长,可以自行搜索

//Guava
List<String> lines = Files.readLines(file, Charsets.UTF_8);

4. 集合新类型

Guava针对开发中的常见场景,提供了一些新的集合类型简化代码。

4.1 Multiset

我们经常碰到一类统计需求——统计某个对象(常见的如字符串)在一个集合中的出现次数,那么会有如下代码:

Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : words) {
Integer count = counts.get(word);
if (count == null) {
counts.put(word, 1);
} else {
counts.put(word, count + 1);
}
}

这段代码看起来有一点丑陋,并且容易出错。Guava提供了一种新的集合类型——Multiset。顾名思义,也就是Set中能够同时存在相同的元素:

Multiset<String> multiset = HashMultiset.create();

multiset.add("a");
multiset.add("a");
multiset.add("b", 5);//add "b" 5 times System.out.println(multiset.elementSet());//[a, b]
System.out.println(multiset.count("a"));//2
System.out.println(multiset.count("b"));//5
System.out.println(multiset.count("c"));//0

Multiset很像一个ArrayList,因为它允许重复元素,只不过它的元素之间没有顺序;同时它又具备Map<String, Integer>的某一些特性。但本质上它还是一个真正的集合类型——用来表达数学上“多重集合”的概念,这个例子只是恰好和Map对应上罢了。

4.2 MultiMap

想必在开发的过程中你一定遇到过实现一个这样的集合:Map<K, List> Map<K, Set>用来表达某一个Key对应的元素是一个集合,可以用两种视角来看待这类集合:

a -> 1 a -> 2 a -> 4 b -> 3 c -> 5

另一种是:

a -> [1, 2, 4] b -> 3 c -> 5

如果使用JDK提供的Collection来实现类似功能,那么一定会有类似上一节中统计数量的代码:添加一个元素时,先在Map中查找该元素对应的List,如果不存在则新建一个List对象。

Multimap<String, Integer> multimap = ArrayListMultimap.create();
multimap.put("a", 1);
multimap.put("a", 2);
multimap.put("a", 4);
multimap.put("b", 3);
multimap.put("c", 5); System.out.println(multimap.keys());//[a x 3, b, c]
System.out.println(multimap.get("a"));//[1 ,2, 4]
System.out.println(multimap.get("b"));//[3]
System.out.println(multimap.get("c"));//[5]
System.out.println(multimap.get("d"));//[] System.out.println(multimap.asMap());//{a=[1, 2, 4], b=[3], c=[5]}

5. 集合工具类

静态创建方法

JDK 7以前,创建泛型集合会比较啰嗦:

List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>();

Guava提供了静态方法来推断泛型的类型:

List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();

当然在JDK 7里泛型的类型推断已经支持:

List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();

Guava除了提供静态构造方法,还提供了一系列工厂类方法来支持集合的创建:

Set<Type> copySet = Sets.newHashSet(elements);
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");

5.1 Sets

我们经常需要操作集合(Set),并对集合进行交并补差等运算,Sets类提供了这些方法:

union(Set, Set)
intersection(Set, Set)
difference(Set, Set)
symmetricDifference(Set, Set)
Set<String> wordsWithPrimeLength = ImmutableSet.of("one", "two", "three", "six", "seven", "eight");
Set<String> primes = ImmutableSet.of("two", "three", "five", "seven"); SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength); // contains "two", "three", "seven"
// I can use intersection as a Set directly, but copying it can be more efficient if I use it a lot.
return intersection.immutableCopy();

5.2 Primitives

Java中的基本类型(Primitive)包括:byte, short, int, long, float, double, char, boolean。

在Guava中与之对应的一些工具类包括Bytes, Shorts, Ints, Longs, Floats, Doubles, Chars, Booleans。现在以Ints为例示范一些常用方法:

System.out.println(Ints.asList(1,2,3,4));
System.out.println(Ints.compare(1, 2));
System.out.println(Ints.join(" ", 1, 2, 3, 4));
System.out.println(Ints.max(1, 3, 5 ,4, 6));
System.out.println(Ints.tryParse("1234"));

5.3Hashing

编写一个Hash散列算法在Java中比较繁复,但是在Guava里却非常简单:

public static String md5(String str) {
return Hashing.md5().newHasher()
.putString(str, Charsets.UTF_8)
.hash()
.toString();
}

更多Hash算法以及其中的一些概念对象请参考HashingExplained

6. 总结

Guava是一个非常有用的现代程序库,在Java项目中强烈推荐使用它来取代Apache Commons的一些子项目(例如Lang, Collection, IO等等),除了这里介绍的一些最常用的特性,它还包括缓存、网络、IO、函数式编程等等内容(其中函数式编程在Java 8中可以使用Stream和Lambda表达式等特性来实现)。它的参考文档应该是Java程序员手头必备之物。

Guava快速入门的更多相关文章

  1. guava快速入门(一)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  2. guava快速入门(三)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  3. guava快速入门(二)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  4. Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门

    文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Mav ...

  5. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  6. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  7. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  8. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. 【Alpha阶段】第一次Scrum Meeting!

    每日任务 1.本次会议为第一次 Meeting会议: 2.本次会议在中午12:30,在第五社区5号楼楼下,召开本次会议为30分钟讨论接下来的任务: 一.今日站立式会议照片 二.每个人的工作 (有wor ...

  2. 201521123045 《Java程序设计》 第十三周学习总结

    201521123045 <Java程序设计> 第十三周学习总结 1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.j ...

  3. 201521123074 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 参考:实验任务书-题目1 1.1 比较ping www.baidu.co ...

  4. 201521123009 《Java程序设计》第1周学习总结

    1. 本周学习总结 对Java进行了了解与简单的学习.第一次接触Java觉得比较难理解. 希望之后的深入学习可以解决目前的一些问题. 2. 书面作业 为什么java程序可以跨平台运行?执行java程序 ...

  5. MySQL集群(一)之主从复制

    前面学完了JDBC,接下来带大家感受一下MySQL集群!其实什么是MySQL集群?简单的说就是一群机器(服务器)的集合,它们连在一起来工作. 其实各种数据库都有自己的集群,常常的多: 我们要学习的就是 ...

  6. SAP高可用性(HA)

    1.SAP系统高可用的要求 高可用性是从终端用户的角度来需求,及要求最大化系统的可用性.其目的是降低意外系统关闭时间(服务器生效.存储失效.操作系统失败--),减少预期系统关闭时间(系统及架构的维护. ...

  7. JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】

    1.什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 2.为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要 ...

  8. JVM锁机制之synchronized

    概述: synchronized是java用于处理多线程同步的一个关键字,用于标记一个方法/代码块,使之成为同步方法/同步块. 用synchronized可以避免多线程处理时的竞态条件问题. 相关概念 ...

  9. SIT 和 UAT

    在企业级软件的测试过程中,经常会划分为三个阶段--单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(Code Review)来保证软件符合客户需求且流程正确.下面简单介 ...

  10. Dynamic web module 版本之间的区别

    Servlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传Servlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释Servlet ...