如何使用固定参数和可变参数创建流?

How can I make stream with fixed arguments along with varargs?

假设我们有以下方法。

void some(int id, int... otherIds) {

}

如何使用这两个参数创建一个 IntStream

IntStream.concat(
        IntStream.of(id),
        Optional.ofNullable(otherIds)
                .map(IntStream::of)
                .orElseGet(IntStream::empty)
);

看起来很冗长。我们有什么简明的成语吗?

当您需要处理可为空的 stream-source 时,您可以使用 Stream.ofNullable() 可通过 Java 9 访问,这会生成 singleton-stream 或空流。它比使用 Optional.ofNullable() 来链接方法更干净。

IntStream.concat(IntStream.of(id),
    Stream.ofNullable(otherIds).flatMapToInt(IntStream::of))

另一种选择是使用 Java 9 静态方法 Objects.requireNonNullElse(),它需要一个可为 null 的参数和一个默认值:

IntStream.concat(IntStream.of(id),
    IntStream.of(Objects.requireNonNullElse(otherIds, new int[0])))

最简单和最干净的解决方案是 fail-fast 实现,如果数组 otherIdsnull,它将抛出 NullPointerException

IntStream.concat(IntStream.of(id), Arrays.stream(otherIds))

它的 null-safe 风味(归功于 @Holger):

IntStream.concat(IntStream.of(id),
                 otherIds != null ? Arrays.stream(otherIds) : IntStream.empty())

嗯,Alexander Ivanchenko 已经提到了三个选项。

这是另一个:

Objects.requireNonNull(otherIds);
Stream.of(new int[] { id }, otherIds)
    .flatMapToInt(Arrays::stream)

我觉得otherIds不应该是null,应该算是程序员的错误。用 Objects::requireNonNull 它 fails-fast.