使用 StreamEx 从 Stream 中删除空的 Optionals

Remove empty Optionals from Stream using StreamEx

我正在寻找一种使用 StreamEx 库仅流式传输非空 Optional 条目的优雅方法。或者标准库,如果可能的话。

目前我正在使用以下相当冗长的方法:

List<Optional<String>> list = 
   Arrays.asList(Optional.of("A"), Optional.empty(), Optional.of("B"));

List<String> nonEmpty = 
   StreamEx.of(list).filter(Optional::isPresent).map(Optional::get).toList();

我基本上是在寻找类似 StreamEx 的 nonNull 方法的东西,但是对于 Optional.

嗯,这个已经添加了,但只在 java-9:

list.stream()
    .flatMap(Optional::stream)
    .collect(Collectors.toList());

Stuart Marks 有一个后向端口 here

对 StreamEx 问题积压的一些研究揭示了 issue 49,它提供了一种更简短的方法并包含关于该主题的讨论:

List<String> nonEmpty = StreamEx.of(list).flatMap(StreamEx::of).toList();

更短,但是否更具可读性还有待讨论。