Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何转换可选的<;T>;流入小溪<;T>;?_Java_Java 8_Java Stream_Optional - Fatal编程技术网

Java 如何转换可选的<;T>;流入小溪<;T>;?

Java 如何转换可选的<;T>;流入小溪<;T>;?,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我想在流前面加一个可选字符。由于Stream.concat只能包含流,我有一个问题: 如何将可选项转换为流? 例如: Optional<String> optional = Optional.of("Hello"); Stream<String> texts = optional.stream(); // not working Optional=Optional.of(“Hello”); 流文本=可选。流();//不起作用 如果受到Java-8的限制,您可以执行以下操

我想在流前面加一个可选字符。由于
Stream.concat
只能包含流,我有一个问题:

如何将可选项转换为流?

例如:

Optional<String> optional = Optional.of("Hello");
Stream<String> texts = optional.stream(); // not working
Optional=Optional.of(“Hello”);
流文本=可选。流();//不起作用

如果受到Java-8的限制,您可以执行以下操作:

Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty);
streamtext=optional.map(Stream::of).orElseGet(Stream::empty);
您可以执行以下操作:

Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
Stream text=可选。isPresent()?Stream.of(可选的.get()):Stream.empty();

在Java-9中,添加了缺少的
stream()
方法,因此此代码可以工作:

Stream<String> texts = optional.stream();
流文本=可选的.Stream();
看。下载Java-9。

如果您不使用Java 9,我可以推荐的
Streams.stream(可选)
方法。一个简单的例子:

Streams.stream(Optional.of("Hello"))
还可以静态导入
Streams.stream
,这样您就可以编写

stream(Optional.of("Hello"))

如果您使用的是较旧版本的Java(看着您,Android),并且正在使用,那么您可以按照以下方式进行操作:

    final List<String> flintstones = new ArrayList<String>(){{
        add("Fred");
        add("Wilma");
        add("Pebbles");
    }};

    final List<String> another = Optional.ofNullable(flintstones)
            .map(Stream::of)
            .orElseGet(Stream::empty)
            .toList();
final List flintstones=new ArrayList(){{
添加(“Fred”);
添加(“威尔玛”);
添加(“卵石”);
}};
最终列表另一个=可选。不可用(燧石)
.map(流::of)
.orElseGet(流::空)
.toList();

这个例子只是列表的一个副本。

我的一个前同事提供的一个很好的库是Streamify。很多收藏家,从实际的一切创造流

在streamify中创建流表单(可选):

Streamify.stream(optional)

它可以取决于您希望如何将空的可选元素转换为流元素。 如果您想将其解释为“无”(或“无元素”):

Stream text=可选。Stream();//自jdk9以来
流文本=可选的.map(Stream::of).orElseGet(Stream::empty);//JDK 8
但如果要将其解释为null:

Stream<String> texts = Stream.of(optional.oreElse(null));
streamtext=Stream.of(可选.oreElse(null));

看,这个问题确实回答了这个问题,但它给出了一个更复杂的例子。我认为这个简单的例子值得保留。我不是
isPresent
的粉丝,它对我来说就像是一个遗留方法,让我想起了Java8之前的时代。但感谢您提供了另一种解决方案。虽然不如
map().orElseGet()
方法流畅,但可能效率略高。我对此表示了支持,因为Java 9在当前状态下对某些项目进行了一些不向后兼容的更改。有些项目,例如,是核心企业工件的一部分,更改速度很慢。如果您的可选项目碰巧包含一个
List
而不是一个
String
对象,您只需将
Stream::of
替换为
List::Stream
。这同样适用于任何其他类型的集合。您也可以只使用
Collection::stream
。否则您将得到一个
,这可能不是您想要的。@walen问题是将
可选
转换为
,如果T是
列表
,就这样吧。答案仍然正确。您可能正在寻找的是将集合扁平化。除此之外,如果你最终使用了
可选的
@Naman,那么你已经走错了路,没有必要证明这个答案是正确的-我没有说它不正确。我刚刚介绍了如何将此解决方案应用于包含
列表的
可选
,有些人可能会遇到这种情况。
Stream<String> texts = Stream.of(optional.oreElse(null));