【问题标题】:Live mapping of JavaFX ObservableList or ReactFX LiveListJavaFX ObservableList 或 ReactFX LiveList 的实时映射
【发布时间】:2015-07-06 08:29:10
【问题描述】:
/**
 * 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 的实时映射,并在源列表更改时更新映射。后来我发现了ReactFX 和它的等价物LiveList.map

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

不想重新发明轮子,我现在正在寻找一个 map 函数,它返回一个可观察对象列表并自动监视这些可观察对象。基本上是整个列表的flatMap。例如,如果我有这个:

<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 中是否存在这样的功能?或者类似的?

【问题讨论】:

  • 参见EasyBind(同样由编写 ReactFX 的 Tomas Mikula 撰写)。
  • flatMap for observable lists 计划在 ReactFX 2.0 中使用,但其签名比您的签名更通用,其中每个列表项都可以映射到一个可观察的 list 项(而不是单个可观察值)。您可以将它与 Val.asList() 结合使用以供您使用。

标签: java javafx java-8 reactfx


【解决方案1】:

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

不过,它计划用于 ReactFX 2.0,可能带有此签名

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

这比您建议的更通用:它将一个元素映射到一个 list,而不仅仅是一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多