清理番石榴方式来处理可能为空的集合

jgm*_*jgm 5 java guava

我有一个方法,它接受一个Collection<Foo> foos可能为NULL 的参数.我希望最终得到一个输入的本地副本作为ImmutableSet.现在我的代码看起来像这样:

if (foos == null)
{
  this.foos = ImmutableSet.of();
}
else
{
  this.foos = ImmutableSet.copyOf(foos);
}
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?如果foos是一个简单的参数我可以做类似的事情,Objects.firstNonNull(foos, Optional.of())但我不确定是否有类似处理集合的东西.

Mat*_*all 13

我不明白为什么你不能使用Objects.firstNonNull:

this.foos = ImmutableSet.copyOf(Objects.firstNonNull(foos, ImmutableSet.of()));
Run Code Online (Sandbox Code Playgroud)

你可以使用静态导入保存一些输入,如果这是你的事情:

import static com.google.common.collect.ImmutableSet.copyOf;
import static com.google.common.collect.ImmutableSet.of;
// snip...
this.foos = copyOf(Objects.firstNonNull(foos, of()));
Run Code Online (Sandbox Code Playgroud)

  • +1并且可能值得指出`copyOf`足够聪明,如果它是一个`ImmutableSet`,它只是返回输入. (5认同)
  • 不幸的是,()`的`ImmutableSet.<Foo>可能是必要的. (3认同)

fge*_*fge 7

A Collection是一个像任何其他参考,所以你可以这样做:

ImmutableSet.copyOf(Optional.fromNullable(foos).or(ImmutableSet.of()));
Run Code Online (Sandbox Code Playgroud)

但这写起来非常少.更简单:

foos == null ? ImmutableSet.of() : ImmutableSet.copyOf(foos);
Run Code Online (Sandbox Code Playgroud)

  • @JohnB`ImputableSet.of()`[返回单例](http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/collect/ImmutableSet.html#line 0.83). (5认同)