11

コレクタが ObservableArrayList を返すことは可能ですか? このような少し:

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

1 に答える 1

24

ObservableListFXCollectionss は、クラスの静的ファクトリで作成されます。

コメントでLouis Wasserman が指摘したように、これは以下を使用して実行できますtoCollection

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

次のようにすることもできます。これは、最初にストリームを に収集し、List次に でラップしObservableListます。

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

(残念ながら、Eclipse Mars 4.5.1 では十分にコンパイルされませんが、javac1.8.0_60 では問題なくコンパイルされます)。

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

ObservableList<String> newList = 
        list.stream()
            .filter(x -> x.startsWith("a"))
            .collect(Collector.of(
                FXCollections::observableArrayList,
                ObservableList::add,
                (l1, l2) -> { l1.addAll(l2); return l1; })
            );
于 2015-11-21T23:01:05.157 に答える