Java Concat固定数量的可选流

Java Concat固定数量的可选流,java,java-stream,Java,Java Stream,我有3种选择: Optional<T> optA = getOptA(); Optional<T> optB = getOptB(); Optional<T> optC = getOptC(); 如果期权的数量增加,这很快就会变得难以处理: Stream.concat(Stream.concat(optA.stream(), optB.stream()), Stream.concat(optC.stream(), optD.stream()); 在使用re

我有3种选择:

Optional<T> optA = getOptA();
Optional<T> optB = getOptB();
Optional<T> optC = getOptC();
如果期权的数量增加,这很快就会变得难以处理:

Stream.concat(Stream.concat(optA.stream(), optB.stream()), Stream.concat(optC.stream(), optD.stream());

在使用reduce时使用
Stream::of
和concat怎么样

Stream.of(optA.stream(), optB.stream(), optC.stream(), optD.stream())
        .reduce(Stream::concat)
        .orElseGet(Stream::empty);
或者你可以使用地图,你的代码应该是:

Stream.of(optA, optB, optC, optD)
        .map(Optional::stream)
        .reduce(Stream::concat)
        .orElseGet(Stream::empty);
这将导致您仅使用注释中提到的
flatMap
组合map和reduce:

Stream.of(optA, optB, optC)
        .flatMap(Optional::stream);

你的选项必须在单独的变量中,而不是在数组或列表中,这是有原因的吗?很遗憾,这是有原因的。我很想重构负责这一点的代码,但我没有时间这么做,因为这是一个复杂的体系结构决策。有多种方法可以将
可选
列表表示为
流。可以在重复链接中引用多个答案。根据您的答案,
Stream.of(optA、optB、optC)。flatMap(可选::Stream)
也可以使用
Stream.of(optA, optB, optC)
        .flatMap(Optional::stream);