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 的项目,导入即可运行。


原始标题:Guava - Lists | Baeldung

« 上一篇: Baeldung周报43
» 下一篇: Java 中的 Timer 详解