实时映射JavaFX ObservableList或ReactFX LiveList

时间:2015-04-27 18:28:07

标签: java javafx java-8 reactfx

/**
 * An observable analogue of {@code Stream.map}. The output list is updated
 * whenever the input list changes.
 */
public static <T, R> ListBinding<R> map(
    ObservableList<? extends T> list,
    Function<T, ? extends R> mapper
);

我编写了上面的JavaFX实用程序方法,该方法创建ObservableList的实时映射,在源列表更改时更新映射。我后来发现了Project Euler及其等效的ReactFX

public interface LiveList {
    default <F> LiveList<F> map(Function<? super E,? extends F> f);
}

我不想再次重新发明轮子,我现在正在寻找一个map函数,它返回一个observable列表并自动观察那些observables。基本上是整个列表的LiveList.map。例如,如果我有这个:

<T, R> ListBinding<R> flatMap(
    ObservableList<? extends T> list,
    Function<T, ObservableValue<? extends R>> mapper
);

然后我可以这样做:

ObservableList<Button>  buttons;
ObservableList<Integer> widths = flatMap(buttons, Button::widthProperty);

如果添加或删除按钮,此widths列表会增大和缩小,如果按钮按下则会更新。{宽度变化。

JavaFX或ReactFX中是否存在此类函数?或类似的东西?

1 个答案:

答案 0 :(得分:2)

我不知道flatMap对可观察列表的任何现有实现。

然而,计划使用ReactFX 2.0,可能还有这个签名

public interface LiveList {
    default <F> LiveList<F> flatMap(Function<? super E,? extends ObservableList<F>> f);
}

比你的建议更通用:它将一个元素映射到列表,而不是一个值。