2015-04-27 3 views
3
/** 
* 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:Живого отображение JavaFX ObservableList или ReactFX LiveList

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

Не желая изобретать колесо снова, теперь я ищу функцию отображения, которая возвращает список наблюдаемых и автоматически следит за тем наблюдаемыми. В основном 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? Или что-нибудь подобное?

+1

См. [EasyBind] (https://github.com/TomasMikula/EasyBind) (также Томас Микула, который написал ReactFX). –

+1

«FlatMap» для наблюдаемых списков планируется для ReactFX 2.0, хотя с более общей подписью, чем ваша, где каждый элемент списка можно сопоставить с наблюдаемым _list_ элементов (в отличие от одного наблюдаемого значения). Вы можете объединить его с [Val.asList()] (http://www.reactfx.org/javadoc/2.0-M4/org/reactfx/value/Val.html#asList--) для вашего варианта использования. –

ответ

2

Мне не известно о существующих реализациях flatMap для наблюдаемых списков.

Это, однако, планируется ReactFX 2,0, вероятно, с этой подписью

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

, который является более общим, чем то, что вы предлагаете: он отображает элемент к списку, а не только одного значения ,