以下是FluentIterable.first()
的方法说明。
当第一个元素为空时,它抛出NPE但不返回Optional.absent()
。
我认为它会使FluentIterable
影响,Optional
因为返回值会让我觉得它完全安全。
我想知道为什么?感谢。
答案 0 :(得分:3)
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()会使结果与空序列大小写无法区分,这可能是个问题。