如何将 LiveData> 转换为 LiveData>?

2023-12-19

假设我们有两个 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, 这个示例应用程序 https://github.com/commonsguy/cw-androidarch/tree/v0.2/General/LiveFilter演示了一个自定义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 会更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 LiveData> 转换为 LiveData>? 的相关文章

  • 不可变位图崩溃错误

    java lang IllegalStateException Immutable bitmap passed to Canvas constructor at android graphics Canvas
  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • 查找回收器视图中的第一个可见项目是否是列表的第一项

    我有一个包含 13 个数据项的回收器视图 我想知道列表中的第一项是否可见 我知道像这样的方法findFirstVisibleItemPosition and findLastVisibleItemPosition但他们没有说明第一个可见项目
  • 在 Android 中的活动、服务和应用程序之间传递变量

    有人可以给我提供以下活动 服务 应用程序组合的示例吗 我拥有这三个 但我已经把我的应用程序弄得一团糟 试图在这个地方传递一堆变量 现在我不知道发生了什么 请注意 我是 Android 新手 最近我一直在努力解决这个问题 因为有很多方法可以实
  • 无法合并 Dex - Android Studio 3.0

    当我在稳定频道中将 Android Studio 更新到 3 0 并运行该项目时 我开始收到以下错误 Error Execution failed for task app transformDexArchiveWithExternalLi
  • 更改 AChartEngine 中的图例大小

    我想专门更改饼图的图例大小输出 我已经尝试了所有可以找到的 AChartEngine 方法 但没有一个只能更改图例文本大小 我必须重写 onDraw 函数吗 如果是这样 怎么办 要设置图例高度 请使用 renderer setLegendH
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • 无法将 Tesseract OCR 模块添加到 Android Studio

    我按照此处找到的分步指南进行操作 https www codeproject com Articles 840623 Android Character Recognition https www codeproject com Artic
  • 在 Android 上的测试用例之外运行 ExtractDecodeEditEncodeMuxTest

    我正在尝试添加在 Android 上提取 解码 编辑 编码和混合视频的功能 因此 我发现了一些非常有用的实现 它是Android CTS的一部分ExtractDecodeEditEncodeMuxTest https android goo
  • Locale.getDefault().getCountry() 返回空字符串

    我正在尝试使用国家 地区代码获取用户语言 例如en US es es 但是当我使用Locale getDefault getCountry 它返回空字符串 虽然它给了我正确的语言Locale getDefault getLanguage N
  • 当参数具有默认值时,为什么无法使用导航组件将参数传递给片段?

    我正在使用导航组件 但我不明白为什么如果定义了参数 则将参数传递给下面的方法时会出现错误 我正在使用 SafeArgs 只有当我为此参数定义默认值时才会出现此错误 有人可以解释一下为什么会发生这种情况以及如何解决它吗 这是导航图的部分代码
  • Facebook LoginActivity 未正确显示

    我有一个使用 Facebook 登录的应用程序 我有 FacebookSDK 并且使用 com facebook LoginActivity 问题是 在 10 英寸平板电脑上 当显示软键盘时 活动无法正确显示 我使用的是 Samsung G
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • 模拟器:进程已完成,退出代码为 134(被信号 6:SIGABRT 中断)

    我最近刚刚开始在 Mac 上下载 Android Studio 版本 3 0 1 但收到以下错误 模拟器 进程已完成 退出代码为 134 被信号 6 SIGABRT 中断 我按照 Android Studio 教程操作并能够运行模拟器 但在
  • 点击监听器的公共类

    我的所有 6 项活动中有 7 个按钮 所有 6 个按钮在所有活动中都具有相同的功能 如何为这 6 个按钮执行通用的单击事件侦听器 您可以创建一个实现 View OnClickListener 的新类 如下所示 public class My
  • Android:如何使视图增长以填充可用空间?

    这看起来很简单 但我不知道该怎么做 我有一个带有 EditText 和两个 ImageButtons 的水平布局 我希望 ImageButtons 具有固定大小 并且 EditText 占据布局中的剩余空间 如何才能做到这一点
  • 带有空白白屏的 WebView

    我在 DialogFragment 中有一个 webview 它使用以下方式显示文档和 PDF它可以进行几次尝试 但如果用户尝试频繁打开和关闭对话框 webview 将显示空白屏幕 我已经尝试了所有的线程link1 https stacko
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • WebView 在某些设备上如果不长按则不会滚动

    我有一个 WebView 设置如下 the web view mWebView WebView findViewById R id webView push the url on to the web view mWebView loadU
  • Android应用程序kill事件捕获

    我想在我的应用程序被终止时执行一些操作 可以使用哪种方法来实现此目的 我正在开发 Android 5 0 这个问题的关键在于 您必须了解您的申请是否可以收到任何 当您的应用程序在任何情况下被终止时的额外回调 下面的答案是由德文连线 http

随机推荐

  • 如何按几何类型过滤地理数据框?

    我正在使用开放街道地图数据 我通过立交桥将其下载为 GEOJSON 数据框 虽然我可以根据标签和子标签过滤数据 如下所示 gdf b gdf b loc gdf b 高速公路 服务 我无法弄清楚删除具有特定几何类型 如点 的地理数据帧的特定
  • 将线程作为库实现

    我读了 线程不能作为库实现 http www hpl hp com techreports 2004 HPL 2004 209 pdf http www hpl hp com techreports 2004 HPL 2004 209 pd
  • 何时使用存储过程而不是嵌入式 SQL

    我很困惑何时应该在代码中使用存储过程而不是嵌入式 SQL 当我谷歌搜索时 我发现了这些要点 它们允许模块化编程 它们可以减少网络流量 它们可以用作安全机制 请告诉我网络流量与它有何关系 SP 的另一个主要优点 您可以更改它们 修复错误 扩展
  • 使用 serde 时如何“展平”向量以生成多个 XML 元素?

    我有以下结构 struct Artist name String image String struct Album title String artists Vec
  • Pandas stack/groupby 来制作新的数据框

    我在创建和重新排列数据集时遇到问题 我查看了 pandas groupby 功能 认为它可能会帮助我做到这一点 但我缺乏经验来实现它 我在下面创建了我的问题的示例 我的 DF vehicle color a b c d A1 A2 A3 B
  • 跟踪 .git/hooks 中钩子的更改

    有没有办法跟踪 git hook 的变化 我有三个钩子 它们只显示在我的机器上 而不是在我的其他开发人员获取时显示 尝试去git add不起作用 http benjamin meyer blogspot com 2008 10 git ho
  • 使用hadoop进行图像处理

    如何在hadoop中读取视频帧 要在 Hadoop 中处理专用文件格式 例如视频 您必须编写自定义的 InputFormat 和 RecordReader 它们了解如何将视频文件转换为分割 InputFormat 然后将分割读取为值 Rec
  • 混合移动应用程序的 HTML 树

    寻找适用于混合移动应用程序并具有以下属性的树 或嵌套列表 UI 组件 拖放 用于插入 删除 更新 展开 折叠和拖动 悬停 放置的动画 视觉反馈 在移动设备上表现良好 开源 我接受付费开源 双重许可等 现代 干净的外观 现代 实现 例如与 A
  • MongoDB RangeError:尝试写入缓冲区边界之外

    除了特定数组之外 我不会一直收到此错误 我正在尝试使用 node js mongodb 本机驱动程序将 JSON 对象插入到 mongodb 集合中 这个 JSON 对象有几个字符串属性和一个大字符串数组属性 数组可以有数千个字符串项 我的
  • 根据背景更改导航字体颜色

    我的问题是这样的 我有一个固定的左侧导航栏 我必须根据其下方部分的背景更改列表字体颜色 代码是这样的fiddle http jsfiddle net 76kMN 2 因此 如果该部分为黑色且位于链接下方 则看不到文本 我必须根据每个列表下面
  • Python获取具有特定扩展名的目录中的最新文件

    我正在尝试使用 upload 目录中带有 log 扩展名的最新文件来由 Python 处理 我用一个UbuntuWeb 服务器和文件上传是通过 html 脚本完成的 上传的文件由Python脚本处理 并将结果写入MySQL数据库 我用了th
  • 为什么 TF2.0 中梯度带的分类交叉熵损失相对于 logits 的梯度为 0?

    我正在学习 Tensorflow 2 0 我正在尝试弄清楚渐变胶带是如何工作的 我有一个简单的示例 其中我评估了 logits 和标签之间的交叉熵损失 我想知道为什么相对于 logits 的梯度为零 请看下面的代码 TF的版本是tensor
  • 如何更改百里香中变量的值?

    我是百里香新手 我现在有点困惑 请查看下面的代码
  • java中如何模拟键盘按下

    我想模拟在 JTextField 中输入字符串 可以包含任何字符 我正在为此使用 new KeyEventData 但我无法确定如何处理 等字符 以及如何将新字符附加到已输入的字符中 您可以使用Robot http docs oracle
  • 头文件中声明的变量是否为包含该头的每个 .c 文件提供变量的单独副本?

    假设有两个源文件 file 1 c and file 2 c 其中包含相同的头文件file h file h has a variable int var Once file 1 c and file 2 c包括file h do file
  • 是否可以在 Windows 7 上使用 PhoneGap 开发 iOS 应用程序?

    我将开发一个在 iPad 上运行的 iOS 应用程序 我将使用 PhoneGap 来完成它 可以在Windows 7上开发吗 我一直在阅读 PhoneGap 文档 它并没有说这是不可能的 但我想我应该在这里提出要求 以避免启动和陷入困境 谁
  • Heroku Cedar 上的静态网站

    我尝试按照说明进行操作here http devcenter heroku com articles static sites on heroku为了在 Heroku 的 Cedar 堆栈上创建一个静态网站 我已经把网站放上来了here h
  • 获取当前控制器

    在一个函数中我想到达当前控制器 front Zend Controller Front getInstance 这只给出了一个处理程序 但没有给出当前控制器 我将代码从函数更改为控制器内部 并询问它们的起源 包括我从 getInstance
  • Avalonia 中的 OpenFileDialog - ShowAsync 错误

    背景 我一直在使用 Avalonia 开发跨平台 UI 为了学习它 我正在尝试创建一个简单的程序 使用以下命令打开 txt 文件OpenFileDialog并将其内容显示在ComboBox在另一个窗口中 我正在尝试编写一个打开文件对话框并返
  • 如何将 LiveData> 转换为 LiveData>?

    假设我们有两个 LiveData 对象 LiveData