gpt4 book ai didi

android - 如何将 LiveData> 转换为 LiveData>?

转载 作者:太空狗 更新时间:2023-10-29 13:51:45 26 4
gpt4 key购买 nike

假设我们有两个 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。

关于android - 如何将 LiveData<List<Foo>> 转换为 LiveData<List<Bar>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com