作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源。 本文是我写的 Google开源的java编程库Guava系列 之一,主要介绍Guava中提供的集合(Collection)相关的API。 1. 一些小功能 集合声明更简单Java中同质的范型集合是一个很大的特色,但是有些时候他们的构造函数有点太啰嗦了,比如:
在Java 7中通过钻石操作符 <> 来允许有限的非正式的类型推导。上面的例子可以这样写:
Guava提供了一些使用范型来进行右侧类型推导的静态函数,使得集合的声明更简单,上面的例子可以这么写:
可以在集合声明时进行初始化
大部分google提供的集合都提供不可变的版本。当你不会修改一个集合,或者期望一个集合是固定不变的,那么一个很好的习惯是防御式地把它拷贝成一个不可变的集合。 注意
更多关于使用或者避免使用 null 的细节见 Using And Avoiding Null Explained 不可变的好处: 可以放心的给不信任的库使用 线程安全:可以被多个线程使用而不会有竞争条件发生 不需要同步(synchronization)的逻辑,不需要支持互斥 设计和实现很简单。所有不可变的集合实现比可变版本的内存效率要高,分析见 这里 如何使用有多种方法来得到一个不可变的集合: 使用 of 函数 ImmutableSet使用 copyOf 函数 ImmutableSet<Integer> another = ImmutableSet.copyOf(numberSet); 所有不可变的集合都通过 asList() 提供了一个不可变的List(ImmutableList)视图。例如数据存储在一个 ImmutableSortedSet 里,可以通过 sortedSet.asList().get(k) 来获得第 k 个最小的元素。 JDK虽然提供了 Collections.unmodifiableXXX 方法,但是有一些问题: 非常笨重,使用起来很啰嗦,用着不爽 不安全:只有当没有对原始集合的引用时,这个函数返回的集合才是真的不可变的 不够高效:数据结构里还是有可变集合里关于并发修改的检查,存储哈希表的额外空间等。 3. 新的集合类型Guava引入的新的集合类型并没有暴露原始的构造函数,或者提供方便初始化操作的工具类,而是直接使用静态工厂函数,例如:
容许一个key有多个值的 MultiMap, MultiMap Multiset支持添加多次相同的值,支持对值进行计数。
表结构的数据类型 Table ,它像Map一样,但是支持两种键--行键(row key)和列键(column key)。 4. 谓语(Predicate)和过滤器(Filter)谓语(Predicate)是一个只包含一个返回布尔类型的函数的简单接口。它的作用是给定一个输入,判断是否满足条件。它可以用来过滤集合,例如实现一个过滤出老客户的 Predicate 。
filter函数的语法是: CollectionPredicates 类包含了 and , or , not in 这几个静态函数来方便构建复杂的谓语。
Predicates 类也包含了很多非常方便的函数,例如 notNull , instanceOf , contains 等。
如果看到这里还意犹未尽的话,建议去看看 源代码 和 单测的代码 ,里面有详尽的用法! 参考资料: Immutable Collections Collection Utilities 如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到! 资助Jack47写作,打赏一个鸡蛋灌饼钱吧
微信打赏
支付宝打赏 |
小黑屋|在路上
( 蜀ICP备15035742号-1 )
GMT+8, 2025-7-9 20:14
Copyright 2015-2025 djqfx