11

Collectors 是否可以向我返回 ObservableArrayList?有点像这样:

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

1 回答 1

24

ObservableLists 是使用类中的静态工厂创建的FXCollections

正如 Louis Wasserman在评论中指出的那样,这可以使用toCollection

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

您还可以执行以下操作,首先将流收集到 a 中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 上编译得很好)。

另一种可能性是为此创建一个自定义收集器。这样做的好处是不需要先使用List. 元素直接收集在 aObservableList中。

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 回答