BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Google Collection 1.0增强了对Java集合框架的支持

| 作者 Josh Long 关注 7 他的粉丝 ,译者 晁晓娟 关注 1 他的粉丝 发布于 2010年1月19日. 估计阅读时间: 9 分钟 | AICon 关注机器学习、计算机视觉、NLP、自动驾驶等20+AI热点技术和最新落地成功案例。

Google Collections库,1.0最终版,2009年12月发布了。你可以在http://code.google.com/p/google-collections/下载它。这个类库是 Google工程师Kevin Bourrillion和Jared Levy的智慧结晶。 最近几年由于Google工程师如Doug Lea, Josh Bloch 和 Bob Lee以及开源社区的贡献,它发展地很快。

Google Collections库希望扩展Java平台的内建集合库。JDK集合库——目前属于java.util.*包中。它主要包括如下一组接口:java.util.Collection (超接口)、java.util.Set、java.util.SortedSet、java.util.Map、和java.util.List等。这些接口直接决定了跟着JDK打包发送的各种实现机制互相之间的协议关系。java.util.Set模糊地定义了一组无序且唯一的元素集合。 java.util.SortedSet则描述了一组有序且唯一元素集合。

java.util.Map定义了一个键值的联合——通常在其他语言中称为字典(dictionary),java.util.List定义了一个有序的集合,而其元素的基数是变化的。最初的框架是由Josh Bloch在Sun工作时定义的,围绕三个方面进行:接口,实现(抽象和实际)以及允许你扩展操作集合的算法。这些接口被介绍为早期JDK提供的类(如 java.util.Vector, java.util.Hashset等)的彻底改进。Josh Bloch在2008 Google Techcast表明Google Collections Library开发的方式让他感觉良好。

Google Collections库也提供了新的工具实现方法和一组关注并发的类库,其中包括不可变集合的实现。“不可变” 保证了系统中没有其他的因素能改变集合的状态,即使是该实现本身。而“不可修改” (就像JDK的java.util.Collections 类的不可修改的工厂方法)只是保证集合的客户端/用户永远不能改变集合。通常,这些实现不是JDK封装器,而是通过适度地调节,更多地考虑内存来重新实现接口。Google Collections 库提供了很多静态工厂方法和程序来创建对象。有时候这些是颠覆冗余类型声明的简单工具方法。

import com.google.common.collect.*;
...
HashSet<String> hashSet = Sets.newHashSet();
LinkedHashSet<String> linkedHashSet = Sets.newLinkedHashSet();
ArrayList<String> arrayList = Lists.newArrayList();
LinkedList<String> linkedList = Lists.newLinkedList();

其他时候,使用静态工厂方法或程序是因为实现工具没有公开的构造函数。很多场合下并不期望创建子类,因为这要求子类接受不可变协议。在Google Collections 库中的Immutable*接口告诉客户端该集合是保证不可变的,并且实现了它们的JDK基本接口协议的语义。可能的情况下集合的用户需要给 Immutable*接口传递引用。

import com.google.common.collect.*;
...
ImmutableSet<Integer> immutableSet = ImmutableSet.of(1, 2, 3, 4, 5);
ImmutableList<String> immutableList = ImmutableList.of("a,b,c,d,e,f,g".split(","));

该类库也提供了一些唯一的实现方法,包括MultiMap和MultiSet 集合(它们描述了支持查询对象在集合中的基数或频率的集合)。这样,为了保存同一个键关联的多个值,你可能需要用到如下方法:

Multimap<String, Integer> personAndFavoriteNumbers = ArrayListMultimap.create();
personAndFavoriteNumbers.put("josh", 42);
personAndFavoriteNumbers.put("josh", 7);
Collection<Integer>numbers = personAndFavoriteNumbers.get("josh"); // doesn't return Integer
System.out.println(numbers .size()) ; // == 2

注意:get(String) 返回一个键相对应的视图。如果一个键在map里没有对应的值,就会返回一个空的集合。如果向该视图集合加入项目,他们就会反映到Multimap:

Collection<Integer>numbers = personAndFavoriteNumbers.get("josh");
System.out.println(numbers .size()) ; // == 2
numbers.add( 0) ;
System.out.println(numbers .size()) ; // == 3
System.out.println(personAndFavoriteNumbers.get("josh").size() ) ; // == 3

对于各种自定义接口有很多可用的并发实现方法:

ConcurrentHashMultiset<String> concurrentHashMultiset =
ConcurrentHashMultiset.create(Arrays.asList("a,b,c,d,e,f".split(",")));

Google Collections库通过com.google.common.base.Predicate类提供了和各种编程语言协作的友善标签。

import com.google.common.collect.*;

Iterable<Integer> filteredSet = Iterables.filter( someIterable, new Predicate<Integer>(){
public boolean apply( Integer integer) {
return integer > 0 ;
}
}) ;

说起该类库的适用性,Google有它在生产部署的记录,以及超过25,000个详尽测试的单元测试套件。尽管Google Collections库看起来非常有前景,但他们也有替代的选择。JDK的每一次迭代都从新的集合改善有所收获。Apache commons collections项目也有一些非常有趣的集合实现,而且比该类库出现早很多年,尽管你发现他们并不是泛型友好的。往前看,Kevin Bourrillion 说过该项目的是为了让该类库正式化后并提交给JCP。

查看英文原文:Google Collections 1.0 Offers Enhanced Implementations of the Java Collections Framework

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

Apache commons collections 支持泛型啊! by 林 江

Apache commons collections 支持泛型啊!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT