如何将LiveData<List<Foo>>转换成LiveData<List<Bar>>?

How to convert LiveData<List<Foo>> into LiveData<List<Bar>>?

假设我们有两个 LiveData 对象:

LiveData<List<Foo>> fooList;
LiveData<List<Bar>> barList;

并且可以通过某种方法(或构造函数)将 Foo 转换为 Bar 对象。 将具有 Foo 对象列表的第一个可观察对象转换为具有 Bar 对象列表的可观察对象的最佳方法是什么。

我知道可以这样做:

barList = Transformations.map(fooList, fooList1 -> {
        List<Bar> barList = new ArrayList<>();
        for (Foo foo: fooList1) {
            barList.add(new Bar(foo)); 
        }
        return barList;
    });

但是有没有更好的方法类似于 RxJava 中的 flatMap 运算符,通过它我们可以对列表中的项目进行所有必要的转换,而不是像示例中那样处理列表本身以上?

您可以创建自己的转换,按照 Transformations 源中显示的方法进行操作。 FWIW,this sample app 演示自定义 filter() 实现:

/***
 Copyright (c) 2017 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain a copy
 of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 Covered in detail in the book _Android's Architecture Components_
 https://commonsware.com/AndroidArch
 */

package com.commonsware.android.livedata;

import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MediatorLiveData;
import android.arch.lifecycle.Observer;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

class LiveTransmogrifiers {
  interface Confirmer<T> {
    boolean test(T thingy);
  }

  @MainThread
  static <X> LiveData<X> filter(@NonNull LiveData<X> source,
                                @NonNull final Confirmer<X> confirmer) {
    final MediatorLiveData<X> result=new MediatorLiveData<>();

    result.addSource(source, new Observer<X>() {
      @Override
      public void onChanged(@Nullable X x) {
        if (confirmer.test(x)) {
          result.setValue(x);
        }
      }
    });

    return(result);
  }
}

否则,没有。 LiveData 是一种轻量级的 RxJava 类似物,具有生命周期感知能力。如果你需要很多运算符,你最好直接使用 RxJava。