2016-10-07 14 views
10

Java 8ではこれを実際に達成するよりエレガントな方法がありますか?Java 8 collect()のみisPresent()オプション値

list.stream() 
    .map(e -> myclass.returnsOptional(e)) 
    .filter(Optional::isPresent) 
    .map(Optional::get) 
    .collect(Collectors.toList()); 

私はおよそfilter(Optional::isPresent)map(Optional::get)が続くと話している、私はエレガントリスト内の値を持っているだけOptional結果を収集します。

+7

の表現を「矢印」を使用する必要があります。私はあなたがそれについて好きではないか分からない。 – khelwood

+0

あなたのすべてのオプションが結果を持っている場合、これはもうオプションではありません...オプションを返し、isPresentがあるかどうかをチェックする代わりに、ヌルとフィルタを返すことができます。フィルタ:Object.NullNull).Collect(Collectors.toList()) ' – alfasin

+2

.map(o - > o.map(Stream: :of)。orElseGet(Stream :: empty))またはここの答えを参照してください:http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan

答えて

-1

その違いはわかりませんが、オプションとフィルタリングを取得する代わりに、オプションに基づいてフィルタリングすることもできます。 これは何か?

list.stream() 
    .filter(e -> myclass.returnsOptional(e).isPresent()) 
    .collect(Collectors.toList()); 

:returnsOptionalは、あなたのオリジナルのリスト項目の種類と同じオブジェクト型を返す場合にのみ動作します。

+0

の代わりに '.map(myclass :: returnsOptional)'これは、OPが生成しているのと同じリストを生成しません。 – khelwood

+0

うん、それはなぜでしょうか? –

+0

'list'は' Foo'型で、 'myclass.returnsOptional(Foo)'は' Optional 'を返します。最後に 'List 'が必要で、 'List ' –

1

mapfiltermapの組み合わせの代わりに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は、静的することができない場合には、あなたがそれは私には正常に見える代わりに「メソッド参照」

関連する問題