Java 8でこれを実際に達成するよりエレガントな方法はありますか?
_list.stream()
.map(e -> myclass.returnsOptional(e))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
_
filter(Optional::isPresent)
に続いてmap(Optional::get)
について話しているのですが、値を持つOptional
の結果のみをリストにエレガントに収集したいのです。
あなたの場合、flatMap
map
と再びfilter
の組み合わせの代わりに、1つのmap
を使用できます。そのためには、ストリームを作成するための別の関数を定義することをお勧めします:public private static Stream<Integer> createStream(String e)
は、ラムダ式に数行のコードが含まれないようにします。
デモの完全な例をご覧ください。
public class Demo{
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
List<Integer> newList = list.stream()
.flatMap(Demo::createStream)
.collect(Collectors.toList());
System.out.println(newList);
}
public static Stream<Integer> createStream(String e) {
Optional<Integer> opt = MyClass.returnsOptional(e);
return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
}
}
class MyClass {
public static Optional<Integer> returnsOptional(String e) {
try {
return Optional.of(Integer.valueOf(e));
} catch (NumberFormatException ex) {
return Optional.empty();
}
}
}
returnsOptionalを静的にできない場合は、「method reference」の代わりに「arrow」式を使用する必要があります。