我想通过摆脱空的Optional来将可选字符串列表转换为字符串列表。 Collectors)?

List<Optional<String>> stringsMaybe = Arrays.asList(Optional.of("Hi"),
                                      Optional.empty(), Optional.of(" there!"));

List<String> strings = stringsMaybe
            .stream()
            .filter(Optional::isPresent)
            .collect(Collectors.mapping(Optional::get, Collectors.toList()));


#1 楼

在流上使用.map而不是Collectors.mapping更为习惯:

从Java 9开始,Optional提供了stream方法,使您可以执行.flatMap(Optional::stream)而不是.filter(...).map(...)

#2 楼

如果使用rxJava,则可以执行以下操作:

Flux<Optional<String>> maybeStrings = Flux.just(
    Optional.of("Hi"),
    Optional.empty(),
    Optional.of(" there!"));

Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) -> 
    maybeString.ifPresent(synchronousSink::next));


评论


\ $ \ begingroup \ $
嗨,在CodeReview上,可以解释为什么您的解决方案比当前代码提供更好的替代方法:)
\ $ \ endgroup \ $
–IEatBagels
18年11月27日在21:12

\ $ \ begingroup \ $
您要使用我的示例而不是选择的答案的唯一原因是,如果您使用的是rxJava Flux,而不是Java 8 Stream。从技术上讲,这不能回答问题,但是搜索此示例的人可能仍会从此摘录中受益。
\ $ \ endgroup \ $
–医生参数
18年11月28日在19:54