map
filter
とmap
の組み合わせの代わりにflatMap
を使用できます。 ストリームを作成するための別の関数を定義する方が良いでしょう: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は、静的することができない場合には、あなたがそれは私には正常に見える代わりに「メソッド参照」
の表現を「矢印」を使用する必要があります。私はあなたがそれについて好きではないか分からない。 – khelwood
あなたのすべてのオプションが結果を持っている場合、これはもうオプションではありません...オプションを返し、isPresentがあるかどうかをチェックする代わりに、ヌルとフィルタを返すことができます。フィルタ:Object.NullNull).Collect(Collectors.toList()) ' – alfasin
.map(o - > o.map(Stream: :of)。orElseGet(Stream :: empty))またはここの答えを参照してください:http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan