Google Guava v11 Collections示例

标签: Java guava | 发表时间:2012-01-07 12:50 | 作者:longhao
出处:http://www.longtask.com/blog

Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。目前主要包含:

  • com.google.common.annotations
  • com.google.common.base
  • com.google.common.cache
  • com.google.common.collect
  • com.google.common.eventbus
  • com.google.common.io
  • com.google.common.net
  • com.google.common.primitives
  • com.google.common.util.concurrent

这里先介绍一下最常用的com.google.common.collect包中的最常用的一些API,仅仅讨论一下API的使用方法,没有讨论到实现细节。

     1:Collections的构造方法

我们平时直接创建Collections对象的方法一般都是用new关键字,有泛型的情况下看起来会比较长:

Map<String , Map<String , String>> see = new HashMap<String, Map<String,String>>();

在java7中,这个初始化做了简化:

Map<String , Map<String , String>> see = new HashMap<>();

可以通过Guava的API来这样写:

Map<String , Map<String , String>> see = Maps.newHashMap();

得到一个有size的Map:

Map<String , Map<String , String>> see = Maps.newHashMapWithExpectedSize(32);

在JDK的collection类型,在Guava中都可以找到相关的static的构造方法,例如: Lists , Sets , Maps , Queues。新的colleciont类型提供了直接构造的方法,例如:HashMultimap<String, String> multiMap = HashMultimap.create();

    2:有限功能的函数式编程

介绍2个重要的接口:

com.google.common.base. Function : 根据输入值来得到输出值

com.google.common.base. Predicate : 根据输入值得到 true 或者 false

拿Collections2中有2个函数式编程的接口:filter , transform ,例如 :在Collection<Integer>中过滤大于某数的内容:

Collection<Integer> filterList = Collections2.filter(collections

     , new Predicate<Integer>(){

                  @Override

                  public boolean apply(Integer input) {

                        if(input > 4)

                              return false;

                        else

                              return true;

                  }

});

把Lis<Integer>中的Integer类型转换为String , 并添加test作为后缀字符:

List<String> c2 = Lists.transform(list, new Function<Integer , String>(){

                  @Override

                  public String apply(Integer input) {

                        return String.valueOf(input) + "test";

                  }            

});

需要说明的是每次调用返回都是新的对象,同时操作过程不是线程安全的。

 

     3:Multimap and BiMap

Map中一个key只能有一个,后续put进去的内容会覆盖前面的内容,有些业务需要有相同的key,但是有不同的内容,Guava中提供了

Multimaps 来解决这个问题。

            Multimap<String, String> prosons = HashMultimap.create();

            prosons.put("longhao", "hubei");

            prosons.put("lilei" , "henan");

            prosons.put("longhao", "shanxi");

            prosons.put("liuxia", "beijing");

            prosons.put("lilei", "hainan");

            Iterator<String> it = prosons.get("longhao").iterator();

            while(it.hasNext()){

                  System.out.println(it.next());

            }

BiMap可以有相同的key,但是不能有相同的value,如果不同的key设置了相同的value,则会抛出IllegalArgumentException异常,可以通过inverse()来反转kv,values()来获取value的set。

public void biMapShouldOnlyHaveUniqueValues() {

     BiMap<Integer, String> biMap = HashBiMap.create();

     biMap.put(1, "a");

     biMap.put(2, "b");

     biMap.put(3, "a"); //argh! an exception

}

     4:tables

给出一个columns, rows , values, 这个API和Map<K , Map<K , V>>形式差不多,多了一些封装。例子:

static void tables(){

            Table<Integer , String , Integer> user = HashBasedTable.create();

            user.put(1, "longhao", 29);

            user.put(1, "shuaige", 29);

            user.put(2, "xiaomi", 1);

            user.put(3, "soso", 3);

            System.out.println(user.containsColumn("soso"));//true

            System.out.println(user.containsColumn("3"));//false

            System.out.println(user.contains(1, "xiaomi"));//false

            System.out.println(user.contains(1, "meinv"));//true

            System.out.println(user.row(1));//{shuaige=29, longhao=29}

}

     5:更简洁的判断

使用Preconditions中的方法来判断是否为空等操作,这个操作和spring,apache common-lang中的API类似

import static com.google.common.base.Preconditions.checkArgument;

import static com.google.common.base.Preconditions.checkNotNull;

static void checkParam(String name , Integer passwd){

            checkNotNull(name , passwd);

            checkArgument("" != name , passwd > 0);

}

Common-lang,spring中的方法需要逐个调用。而Guava中支持。

     6:约束

对Collection中的新加入元素做约束,只有符合条件的元素才能够被添加到Collection中,可以使用Constraint类来操作。

示例代码:

import static com.google.common.collect.Constraints.constrainedList;

static void constraintExam(){

            Constraint<String> chkListStr = new Constraint<String>(){

                  @Override

                  public String checkElement(String element) {

                        if(element.startsWith("h")){

                              throw new IllegalArgumentException("不允许有h开头的内容");

                        }

                        return element;

                  }            

            };

            List<String> list = Lists.newArrayList("li","hao","a");

            List<String> conList = constrainedList(list, chkListStr);

            conList.add("soso");

            conList.add("hqb");// throw IllegalArgumentException

            for(String str : list){

                  System.out.println(str);

            }

}

     参考资料

相关 [google guava v11] 推荐:

Google Guava v11 Collections示例

- - 龙浩的blog
Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库. 这里先介绍一下最常用的com.google.common.collect包中的最常用的一些API,仅仅讨论一下API的使用方法,没有讨论到实现细节.      1:Collections的构造方法.

Google Guava Collections 使用介绍

- 半兽人 - IBM developerWorks 中国 : Java technology : Articles,Tutorials
Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源项目. 由于它高质量 API 的实现和对 JDK5 特性的充分利用,使得其在 Java 社区受到很高评价. 笔者主要介绍它的基本用法和功能特性.

[Google Guava] 排序: Guava强大的”流畅风格比较器”

- - 并发编程网 - ifeve.com
原文链接 译者: 沈义扬. 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能. 从实现上说,Ordering实例就是一个特殊的Comparator实例. Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器.

Google Guava官方教程(中文版)

- - Java - 编程语言 - ITeye博客
原文链接   译文链接  译者: 沈义扬, 罗立树,何一昕, 武祖   校对:方腾飞. Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等.

Guava cache

- - 孟飞阳的博客
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制. 整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好.    Guava Cache有两种创建方式:.   通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值.

Google Guava的5个鲜为人知的特性

- - Java译站
Google Guava有哪些比较冷门但却又实用的特性呢. 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比赛的地方(起码 实习期内是这样的). 它虽然不是来自哈利波特中的霍格沃兹学校,但却有着自己的专属魔力:Google Guava库包含着许多诞生于Google的核心Java库,这些都是公开发布后在生产环境经历过了各种检验的.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

[转][转]Redis、Memcached、Guava、Ehcache中的算法

- - heiyeluren的blog(黑夜路人的开源世界)
缓存那些事,一是内存爆了要用LRU(最近最少使用)、LFU(最少访问次数)、FIFO的算法清理一些;二是设置了超时时间的键过期便要删除,用主动或惰性的方法. 今天看 Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不得,这旧版的"近似LRU"算法,实在太简单,太偷懒,太Redis了.

维度数据实时关联的实践(w/ Flink、Vert.x & Guava Cache) - 简书

- -
在流式处理作业(特别是实时数仓ETL作业)中,我们的数据流可以视为无界事实表,其中往往缺乏一些维度信息. 例如,对于埋点日志流而言,为了减少传输冗余,可能只会带有城市ID、商品ID等,如果要映射到对应的名称,就需要与外部存储中的维度表进行关联. 这里的外部存储一般是指适合OLTP场景的数据库,如MySQL、Redis、HBase等.

谷奥: Google = Google+

- 吞佛 - 谷奥聚合——谷奥主站+谷安 aggregator
在上周举办的Google Zeitgeist 2011大会上,John Battelle问Larry Page:在Google大部分的历史里,人们会想到搜索,那么Google品牌=搜索. 但在随后Google的发展史里,Google品牌会等于什么. Larry Page并未直面回答这个问题,至少没有从市场角度来回答.