Наилучшая практика использования MediatorLiveData только по имеющимся данным

В качестве выбора по умолчанию вам следует предпочесть std :: anything , чтобы повысить :: samething , потому что он является частью стандартной библиотеки и, следовательно, более переносим, ​​поскольку он не ввести внешнюю зависимость.

Вы вообще не можете сравнивать std::mutex и boost::mutex, потому что нет один и только std::mutex, его реализация зависит от стандартного используемой библиотеки, которая обычно является частью вашей инструментальной цепочки.

Возможно, будет случай, когда вы обнаружите использование эмпирических доказательств того, что std::mutex, который вы используете, в некотором отношении «хуже», чем boots::mutex. В этом случае можно было бы быть разумным переключиться на него, но только если это действительно оправдано, и у вас есть фактическое свидетельство (например, измерение производительности). Даже тогда это выглядит как последнее средство. Возможно, было бы лучше переключиться на другую стандартную реализацию библиотеки или на другую инструментальную цепочку или обновить ваш текущий, если это возможно.

3
задан Naryxus 19 January 2019 в 21:59
поделиться

2 ответа

Вам не нужно добавлять его к каждому выражению каждого отдельного источника, так как вы не обращаетесь к переменной foo в своем лямбда-выражении. Поэтому вы можете вызывать вспомогательную функцию вместо всех ваших лямбда-выражений (или, может быть, вы даже можете повторно использовать одно и то же лямбда-выражение для всех источников, не можете проверить эту атм.), Таким образом, вам нужно только определить проверки внутри вашего одиночная вспомогательная функция.

0
ответ дан CitrusO2 19 January 2019 в 21:59
поделиться

Сначала вам понадобятся несколько кортежей:

,
public class Tuple2<S, T> {
    public final S first;
    public final T second;

    public Tuple2(S first, T second) {
        this.first = first;
        this.second = second;
    }
}
,

,

,
public class Tuple3<S, T, U> {
    public final S first;
    public final T second;
    public final U third;

    public Tuple3(S first, T second, U third) {
        this.first = first;
        this.second = second;
        this.third = third;
    }
}
,

,

,
public class Tuple4<S, T, U, V> {
    public final S first;
    public final T second;
    public final U third;
    public final V fourth;

    public Tuple4(S first, T second, U third, V fourth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
    }
}
,

. Когда у вас есть свои кортежи, вы можете написать вспомогательные функции, которые работа, похожая на Transformations.map, но теперь вы можете сделать:

public class LiveDataTransformations {
    private LiveDataTransformations() {}

    public static <S, T> LiveData<Tuple2<S,T>> ifNotNull(LiveData<S> first, LiveData<T> second) {
        MediatorLiveData<Tuple2<S, T>> mediator = new MediatorLiveData<>();

        mediator.addSource(first, (_first) -> {
            T _second = second.getValue();
            if(_first != null && _second != null) {
                mediator.setValue(new Tuple2(_first, _second));
            }
        });

        mediator.addSource(second, (_second) -> {
            S _first = first.getValue();
            if(_first != null && _second != null) {
                mediator.setValue(new Tuple2(_first, _second));
            }
        });

        return mediator;
    }

    public static <S, T, U> LiveData<Tuple3<S,T,U>> ifNotNull(LiveData<S> first, LiveData<T> second, LiveData<U> third) {
        MediatorLiveData<Tuple3<S, T, U>> mediator = new MediatorLiveData<>();

        mediator.addSource(first, (_first) -> {
            T _second = second.getValue();
            U _third = third.getValue();
            if(_first != null && _second != null && _third != null) {
                mediator.setValue(new Tuple3(_first, _second, _third));
            }
        });

        mediator.addSource(second, (_second) -> {
            S _first = first.getValue();
            U _third = third.getValue();
            if(_first != null && _second != null && _third != null) {
                mediator.setValue(new Tuple3(_first, _second, _third));
            }
        });

        mediator.addSource(third, (_third) -> {
            S _first = first.getValue();
            T _second = second.getValue();
            if(_first != null && _second != null && _third != null) {
                mediator.setValue(new Tuple3(_first, _second, _third));
            }
        });

        return mediator;
    }

    public static <S, T, U, V> LiveData<Tuple4<S,T,U, V>> ifNotNull(LiveData<S> first, LiveData<T> second, LiveData<U> third, LiveData<V> fourth) {
        MediatorLiveData<Tuple4<S, T, U, V>> mediator = new MediatorLiveData<>();

        mediator.addSource(first, (_first) -> {
            T _second = second.getValue();
            U _third = third.getValue();
            V _fourth = fourth.getValue();
            if(_first != null && _second != null && _third != null && _fourth != null) {
                mediator.setValue(new Tuple4(_first, _second, _third, _fourth));
            }
        });

        mediator.addSource(second, (_second) -> {
            S _first = first.getValue();
            U _third = third.getValue();
            V _fourth = fourth.getValue();
            if(_first != null && _second != null && _third != null && _fourth != null) {
                mediator.setValue(new Tuple4(_first, _second, _third, _fourth));
            }
        });

        mediator.addSource(third, (_third) -> {
            S _first = first.getValue();
            T _second = second.getValue();
            V _fourth = fourth.getValue();
            if(_first != null && _second != null && _third != null && _fourth != null) {
                mediator.setValue(new Tuple4(_first, _second, _third, _fourth));
            }
        });

        mediator.addSource(fourth, (_fourth) -> {
            S _first = first.getValue();
            T _second = second.getValue();
            U _third = third.getValue();
            if(_first != null && _second != null && _third != null && _fourth != null) {
                mediator.setValue(new Tuple4(_first, _second, _third, _fourth));
            }
        });

        return mediator;
    }
}

Теперь вы можете сделать

LiveData<???> liveDataForView;

private void setupForView() {
   LiveData<Tuple3<Foo, Bar, FooBar>> intermediate =  LiveDataTransformations.ifNotNull(liveData1, liveData2, liveData3);
   liveDataForView = Transformations.map(intermediate, (tuple) -> {
       Foo foo = tuple.first;
       Bar bar = tuple.second;
       FooBar fooBar = tuple.third;

       return /*Some combinations of the LiveDatas*/
   });
}
0
ответ дан EpicPandaForce 19 January 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: