javaでOptional
のstreamから空で無いものを得ようとするのは結構面倒だった。https://www.baeldung.com/java-filter-stream-of-optional にあるようにfilter()
かflatMap()
で頑張るしかなかった。が、java 9からOptional::stream
が追加されてだいぶ楽になった。
いま、以下のような、もし空文字であればOptional.empty()
を返す関数がある、とする。これを文字列リストの各要素に適用し、非空文字のリストを得たい、とする。
static Optional<String> map(String s) {
if (s.length() == 0) {
return Optional.empty();
}
return Optional.of(s);
}
filter
で頑張るのはこんな感じ。
List.of("1", "2", ,"", "3").stream()
.map(Hoge::map)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
java 9のOptional::stream
を使うとこうなる。
List.of("1", "2", "", "3").stream()
.map(Hoge::map)
.flatMap(Optional::stream)
.collect(Collectors.toList());