1. 概述

在Java编程中,处理null值往往是简洁代码背后的陷阱,尤其是在操作数组时。将可能为null的数组转换为空List不仅是为了避免NullPointerException,更是为了编写健壮的代码。

本文将探讨多种安全地将可空数组转换为List的方法。

2. 准备工作

首先定义我们的方法签名,后续所有实现都将基于此:

static List<String> getAsList(String[] possiblyNullArray) {
    // 实现:将可能为null的数组转换为List
}

我们接收一个possiblyNullArray参数,并返回一个非null的List,其中包含原数组的所有元素。关键点:如果原数组为null或空,最终返回的List也必须是空的

接下来看几种实现方案。

3. 使用Java 8+ Streams

第一种实现使用Java的Stream API。Java 8引入了Optional类专门处理可能为null的值。

先用Optional.ofNullable()包装数组:

return Optional.ofNullable(possiblyNullArray)
  .map(Arrays::stream)
  .orElseGet(Stream::empty)
  .collect(Collectors.toList());

我们将数组包装在Optional中,然后尝试获取其流。如果数组为null,会得到空流而非元素流。这样在收集流到List时,结果要么是原数组的元素列表,要么是空列表。

如果想避免流式操作,可以换个方式处理Optional的默认值:

return Arrays.asList(Optional.ofNullable(possiblyNullArray).orElse(new String[0]));

这里在转换前就处理了null情况:如果原数组为null,就返回空数组再转List。

两种方案都能用单行表达式安全返回String类型的List。

4. 使用三元运算符

Java 8之前,可以用简单的三元运算符检查null,并在数组为null时返回空List:

return possiblyNullArray == null ? Collections.emptyList() : Arrays.asList(possiblyNullArray);

这是个简短的if/else表达式:数组为null时返回空List,否则用Arrays.asList()转换——简单粗暴的解决方案。

5. 使用Apache Commons Lang

有时我们想依赖外部库完成工作。第三种方案跳出核心Java API,使用Apache Commons Lang

该库的ArrayUtils类提供了nullToEmpty()方法,能将null数组转为空数组:

String[] notNullArray = ArrayUtils.nullToEmpty(possiblyNullArray);
return Arrays.asList(notNullArray);

之后只需将处理后的数组转为List即可。

6. 验证方案

现在测试所有实现,覆盖以下三种场景:

@Test
public void whenArrayIsNull_thenReturnEmptyList() {
    String[] possiblyNullArray = null;

    assertThat(getAsList(possiblyNullArray)).isNotNull().isEmpty();
}

@Test
public void whenArrayIsEmpty_thenReturnEmptyList() {
    String[] possiblyNullArray = {};

    assertThat(getAsList(possiblyNullArray)).isNotNull().isEmpty();
}

@Test
public void whenArrayIsNotEmpty_thenReturnListWithSameElements() {
    String[] possiblyNullArray = {"a", "b"};

    assertThat(getAsList(possiblyNullArray)).containsExactly(possiblyNullArray);
}

这三个测试覆盖了null数组、空数组和有值数组,囊括了所有可能情况

7. 总结

本文介绍了多种将可空数组转换为List的方法,同时避免NullPointerException:

  • ✅ Java 8+的Optional特性
  • ✅ 三元运算符
  • ✅ Apache Commons等外部库

每种方案各有优劣,根据项目需求选择即可。记住:处理null值是编写健壮代码的关键一步。


原始标题:Null Array to Empty List in Java | Baeldung