1. 概述
本教程将带你快速了解如何使用 Guava 库中提供的 Lists
工具类 来高效地操作 Java 中的 List
集合。
我们从一个最简单的例子开始:用 Guava 的语法创建一个 ArrayList
,而无需显式使用 new
关键字:
List<String> names = Lists.newArrayList("John", "Adam", "Jane");
是不是简单粗暴?接下来我们会深入介绍一些更实用的方法。
2. 反转 List
使用 Lists.reverse()
可以轻松实现对 List
的反转操作。来看下面这个例子:
@Test
public void whenReverseList_thenReversed() {
List<String> names = Lists.newArrayList("John", "Adam", "Jane");
List<String> reversed = Lists.reverse(names);
assertThat(reversed, contains("Jane", "Adam", "John"));
}
✅ 不会修改原始 List,而是返回一个新的反转后的 List。
3. 将字符串转换为字符列表
有时候我们需要把一个字符串拆成一个个字符组成的 List<Character>
,Guava 提供了非常方便的 API —— Lists.charactersOf()
:
@Test
public void whenCreateCharacterListFromString_thenCreated() {
List<Character> chars = Lists.charactersOf("John");
assertEquals(4, chars.size());
assertThat(chars, contains('J', 'o', 'h', 'n'));
}
⚠️ 注意:这个方法返回的是不可变的 ImmutableList
。
4. 对 List 进行分片(Partition)
当你要把一个大 List 按固定大小切分成多个子 List 时,可以用 Lists.partition()
方法:
@Test
public void whenPartitionList_thenPartitioned(){
List<String> names = Lists.newArrayList("John","Jane","Adam","Tom","Viki","Tyler");
List<List<String>> result = Lists.partition(names, 2);
assertEquals(3, result.size());
assertThat(result.get(0), contains("John", "Jane"));
assertThat(result.get(1), contains("Adam", "Tom"));
assertThat(result.get(2), contains("Viki", "Tyler"));
}
✅ 分区后每个子 List 的大小由你指定,最后一个可能小于指定大小。
5. 去除 List 中的重复元素
虽然 Java 8 的 Stream API 也能做到这一点,但 Guava 提供了一种更简洁的方式:
@Test
public void whenRemoveDuplicatesFromList_thenRemoved() {
List<Character> chars = Lists.newArrayList('h','e','l','l','o');
assertEquals(5, chars.size());
List<Character> result = ImmutableSet.copyOf(chars).asList();
assertThat(result, contains('h', 'e', 'l', 'o'));
}
⚠️ 注意:这种方式不会保留原有顺序(除非使用 LinkedHashSet
),但在大多数场景下足够用了。
6. 移除 List 中的 null 值
处理数据时经常遇到含有 null
的集合,Guava 提供了优雅的方式来清除它们:
@Test
public void whenRemoveNullFromList_thenRemoved() {
List<String> names = Lists.newArrayList("John", null, "Adam", null, "Jane");
Iterables.removeIf(names, Predicates.isNull());
assertEquals(3, names.size());
assertThat(names, contains("John", "Adam", "Jane"));
}
✅ 使用 Iterables.removeIf()
和 Predicates.isNull()
组合,直接在原 List 上移除所有 null
元素。
7. 将 List 转换为不可变副本
如果你希望某个 List 在后续操作中不再被修改,可以将其转换为 ImmutableList
:
@Test
public void whenCreateImmutableList_thenCreated() {
List<String> names = Lists.newArrayList("John", "Adam", "Jane");
names.add("Tom");
assertEquals(4, names.size());
ImmutableList<String> immutable = ImmutableList.copyOf(names);
assertThat(immutable, contains("John", "Adam", "Jane", "Tom"));
}
⚠️ 修改原始 List 不会影响已创建的 ImmutableList
实例。
8. 总结
到这里,我们已经覆盖了 Guava 中关于 List
的大部分常见用法。如果你想进一步掌握 Guava 的强大功能,建议继续阅读以下内容:
所有的代码示例都可以在 GitHub 项目 中找到。这是一个基于 Eclipse 的项目,导入即可运行。