Google 开源库Guava详解(集合工具类)

任何具有JDK Collections Framework经验的程序员都知道并喜欢java.util.Collections.Guava提供了更多的实用程序:适用于所有集合的静态方法。这些是番石榴最受欢迎和成熟的部分。

对应于特定接口的方法以相对直观的方式分组:

|------------|---------------|-----------------------------------|
| nterface | JDK or Guava? | Corresponding Guava utility class |
| Collection | JDK | Collections2 |
| List | JDK | Lists |
| Set | JDK | Sets |
| SortedSet | JDK | Sets |
| Map | JDK | Maps |
| SortedMap | JDK | Maps |
| Queue | JDK | Queues |
| Multiset | Guava | Multisets |
| Multimap | Guava | Multimaps |
| BiMap | Guava | Maps |
| Table | Guava | Tables |

一、静态构造函数

在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");

此外,通过命名工厂方法(有效Java项1),我们可以提高将集合初始化为大小的可读性:

复制代码
List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100);

下面列出了提供的精确静态工厂方法及其相应的实用程序类。

注意:Guava引入的新集合类型不公开原始构造函数,或者在实用程序类中具有初始值设定项。相反,它们直接公开静态工厂方法,例如:

复制代码
Multiset<String> multiset = HashMultiset.create();

二、Iterables

只要可能,Guava更喜欢提供接受Iterable而不是Collection的实用程序。在谷歌,遇到一个"集合"并不罕见,它实际上没有存储在主存中,而是从数据库或另一个数据中心收集的,并且在不实际获取所有元素的情况下无法支持size()等操作。

因此,您可能希望看到的所有集合都支持的许多操作都可以在Iterables中找到。此外,大多数Iterables方法在iterator中都有一个接受原始迭代器的相应版本。

Iterables类中的绝大多数操作都是懒惰的:它们只在绝对必要的时候推进支持迭代。返回Iterables的方法返回延迟计算的视图,而不是在内存中显式地构造集合。

从Guava 12开始,Iterables由FluentInterable类补充,该类封装了Iterable,并为其中许多操作提供了"流畅"的语法。

以下是最常用的实用程序的选择,尽管在Guava函数习语中讨论了Iterables中许多更"函数"的方法。

1、一般使用

|-----------------------------------|----------------------------------------------------|-----------------------------------------------------------------|
| Method | Description | See Also |
| concat(Iterable<Iterable>) | 返回几个可迭代项的串联的惰性视图。 | concat(Iterable...) |
| frequency(Iterable, Object) | 返回对象的出现次数。 | Compare Collections.frequency(Collection, Object); see Multiset |
| partition(Iterable, int) | 返回一个不可修改的可迭代视图,该视图被划分为指定大小的块。 | Lists.partition(List, int), paddedPartition(Iterable, int) |
| getFirst(Iterable, T default) | 返回可迭代项的第一个元素,如果为空,则返回默认值。 | Compare Iterable.iterator().next(), FluentIterable.first() |
| getLast(Iterable) | 返回可迭代项的最后一个元素,如果它为空,则会以NoSuchElementException快速失败。 | getLast(Iterable, T default), FluentIterable.last() |
| elementsEqual(Iterable, Iterable) | 如果可迭代项具有相同顺序的相同元素,则返回true。 | Compare List.equals(Object) |
| unmodifiableIterable(Iterable) | 返回可迭代项的不可修改视图。 | Compare Collections.unmodifiableCollection(Collection) |
| limit(Iterable, int) | 返回一个Iterable,最多返回指定数量的元素。 | FluentIterable.limit(int) |
| getOnlyElement(Iterable) | 返回Iterable中唯一的元素。如果可迭代项为空或具有多个元素,则快速失败。 | getOnlyElement(Iterable, T default) |

复制代码
Iterable<Integer> concatenated = Iterables.concat(
  Ints.asList(1, 2, 3),
  Ints.asList(4, 5, 6));
// concatenated has elements 1, 2, 3, 4, 5, 6

String lastAdded = Iterables.getLast(myLinkedHashSet);

String theElement = Iterables.getOnlyElement(thisSetIsDefinitelyASingleton);
  // if this set isn't a singleton, something is wrong!
相关推荐
NiceCloud喜云40 分钟前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
SamDeepThinking1 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
momo1 小时前
JAVA基础知识
java·开发语言
就叫_这个吧2 小时前
Activiti7工作流入门+案例应用
java·activiti7·工作流
Z_W_H_2 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube
折哥的程序人生 · 物流技术专研2 小时前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
郑州光合科技余经理2 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
耀耀_很无聊2 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
奶油话梅糖3 小时前
锐捷常用命令速查表
java·网络·windows
code_std3 小时前
java WebSocket 使用
java·开发语言·websocket