Mappage en direct de JavaFX ObservableList ou ReactFX LiveList


/**
 * 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
);

J'ai écrit la méthode utilitaire JavaFX ci-dessus qui crée un mappage en direct d'un ObservableList, mettant à jour le mappage chaque fois que la liste source change. J'ai découvert plus tard ReactFX et son équivalent LiveList.map:

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

Ne voulant pas réinventer à nouveau la roue, je cherche maintenant une fonction de carte qui renvoie une liste d'observables et surveille automatiquement ces observables. Fondamentalement, un flatMap pour une liste complète. Par exemple, si j'avais ceci:

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

Alors je pourrais faire ceci:

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

Cette liste widths augmenterait et diminuerait si des boutons sont ajoutés ou supprimés, et serait mise à jour si les largeurs des boutons changent.

Une telle fonction existe-t-elle dans JavaFX ou dans ReactFX? Ou quelque chose de semblable?

Author: John Kugelman, 2015-04-27

1 answers

Je ne connais aucune implémentation existante de flatMap pour les listes observables.

Il est cependant prévu pour ReactFX 2.0, probablement avec cette signature

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

Qui est plus général que ce que vous proposez: il mappe un élément à une list, au lieu d'une seule valeur.

 2
Author: Tomas Mikula, 2015-04-27 22:31:50