收集器 lambda return 可观察列表

Collectors lambda return observable list

Collectors 可以 return 我一个 ObservableArrayList 吗?有点像这样:

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

ObservableLists 是使用来自 FXCollections class.

的静态工厂创建的

正如 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 上编译,但可以在 javac 1.8.0_60 上正常编译)。

另一种可能性是为此创建一个自定义收集器。这样做的好处是不需要先使用 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; })
            );