2015-11-21 26 views
7

コレクターがObservableArrayListを返すことは可能ですか?このような小さな:コレクターラムダ観測可リスト

ObservableList<String> newList = list.stream(). 
     filter(x -> x.startsWith("a"). 
     collect(Collectors.toCollection(ObservableArrayList::new)); 
+0

あなたはそれをやった、あなたはしませんでしたか? – assylias

+1

@assyliasいいえ、ObservableArrayList'のコンストラクタはありません(実際にはイベントクラスではありません) – Tunaki

答えて

14

ObservableList sがFXCollectionsクラスのstaticファクトリで作成されます。

ストリームを最初に収集してListにしてから、ObservableListの中にラップします。 (残念ながら十分なEclipseの火星4.5.1でコンパイルが、javac 1.8.0_60に罰金コンパイルされません)

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.collectingAndThen(toList(), l -> FXCollections.observableArrayList(l))); 

もう1つの可能性は、このためのカスタムコレクタを作成することです。これには、最初にListを使用する必要がないという利点があります。要素はObservableListの内部に直接収集されます。

ルイ・ワッサーマン in the commentsで述べたように、この最後の式は toCollectionを使用して、より簡単に書き換えることができ
ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collector.of(
       FXCollections::observableArrayList, 
       ObservableList::add, 
       (l1, l2) -> { l1.addAll(l2); return l1; }) 
      ); 

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.toCollection(FXCollections::observableArrayList)); 
+1

最後の式が厄介に見えます。ありがとう – Josephus87

+1

@ Josephus87静的なインポートは少し助けます。また、中間リストを使用しない第2の可能性を追加しました。 – Tunaki

+3

なぜ 'collect(toCollection(observerableArrayList))'は両方の問題を解決しますか? –

関連する問題