IntStream.empty()方法的目的是什么?

时间:2015-07-27 18:01:14

标签: java java-8 java-stream

在有关新JDK8流API的教程中,我遇到了.empty()IntStreamDoubleStream的静态LongStream方法。

那么什么时候使用这种方法有意义呢?

3 个答案:

答案 0 :(得分:7)

一个很好的例子是从IntStream创建OptionalInt:如果存在可选项,则需要单例流;如果不存在可选项,则需要空流:

public static IntStream ofOptional(OptionalInt optional) {
    return optional.isPresent() ? IntStream.of(optional.get()) : IntStream.empty();
}

实际上这种方法已经{J}到JDK9。

答案 1 :(得分:4)

(您曾在empty()IntStreamLongStream上询问DoubleStream方法,但此方法也在Stream界面上供参考类型。)

一般的答案是empty()可用作传递给获取流的API的流源 - 无论是作为参数还是作为返回值 - 以及没有要传递的值。在大多数情况下,您无法传递null,您必须传递某种流。获取没有值的流的方法是使用Stream.empty()和朋友。

这是一个重复偶数并删除奇数并将它们收集到列表中的示例:

    List<Integer> list = 
        IntStream.range(0, 10)
                 .flatMap(i -> (i & 1) == 0 ? IntStream.of(i, i) : IntStream.empty())
                 .boxed()
                 .collect(Collectors.toList());

结果是

[0, 0, 2, 2, 4, 4, 6, 6, 8, 8]
正如人们所期待的那样。重点是flatMap()传递一个值,并期望接收任意数量的值,包括零值。这样做的方法是让flat-mapping操作返回一个值流。要让它返回零值,它将返回一个空流。

答案 2 :(得分:3)

您可以使用初始化您提到的任何类型的空Stream。 我将其视为构建新对象的另一种方式。就那么简单。

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#empty--