收藏家lambda返回可观察列表

Jos*_*s87 10 java lambda java-8 observablelist collectors

收藏家有可能给我一个ObservableArrayList吗?有点像这样:

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

Tun*_*aki 17

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

您可以执行以下操作,首先将流收集到a中List,然后将其包装到内部ObservableList.

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

(遗憾的是,它不能在Eclipse Mars 4.5.1上编译,但在javac1.8.0_60 上编译得很好).

另一种可能性是为此创建自定义收集器.这具有不需要首先使用a的优点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; })
            );
Run Code Online (Sandbox Code Playgroud)

正如Louis Wasserman 在评论中指出的那样,最后一个表达式可以更简单地重写toCollection:

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

  • 为什么不只是`collect(toCollection(FXCollections :: observableArrayList))`,它解决了这两个问题? (3认同)