当第一个元素为null时,为什么FluentIterable.first()会抛出NPE

时间:2015-05-26 06:58:08

标签: guava

以下是FluentIterable.first()的方法说明。

当第一个元素为空时,它抛出NPE但不返回Optional.absent()

我认为它会使FluentIterable影响,Optional因为返回值会让我觉得它完全安全。

我想知道为什么?感谢。

2 个答案:

答案 0 :(得分:3)

这是documented behavior

public final Optional<E> first()
     

返回包含此流畅迭代中第一个元素的Optional。如果iterable为空,则返回Optional.absent()

     

抛出:
  NullPointerException - 如果第一个元素是null; 如果有可能,请使用iterator().next()Iterables.getFirst(java.lang.Iterable<? extends T>, T)代替

重点是我的,作为解决方法遵循上述建议。通常,Guava's collections are null-hostile

在这种特殊情况下,抛出NPE是为了避免歧义,因为当 iterable为空时返回Optional.absent() ,而不是当第一个元素是null时返回。

答案 1 :(得分:2)

从下面的方法代码中可以看出,FluentIterable.first未实现处理具有空值的序列。返回类型中的Optional是处理序列为空的可能性。

以下是该方法的代码:

  public final Optional<E> first() {
    Iterator<E> iterator = iterable.iterator();
    return iterator.hasNext()
        ? Optional.of(iterator.next())
        : Optional.<E>absent();
  }

请注意,如果提供的对象为null,Optional.of将抛出NPE。

P.S。对于第一个元素为null的情况返回Optional.absent()会使结果与空序列大小写无法区分,这可能是个问题。