Jetpack篇——LiveData扩展之Transformations

本文深入解析LiveData Transformations类中的map、switchMap和distinctUntilChanged方法,通过实例展示这些方法如何在Android开发中处理数据流的转换与过滤。

一、简单介绍

Transformations 类是 LiveData 的一个功能扩展类,其是一个私有化构造方法的工具类,且只提供 3 个方法使用,虽然数量不多,但胜在实用,这三个方法分别是:

  1. map
  2. switchMap
  3. distinctUntilChanged

那么接下来我们就一一分析每个方法及其源码实现过程,如果想要更清楚的了解源码建议先了解 这篇文章


二、map

其实看名字我们就能大概知道这个方法是个什么样的存在……
识破
类似于 RxJavamap 操作符、Kotlin 中数组的扩展函数 map,其实 Transformationsmap 方法也是一个转化的功能。

1、普通实现

先看看效果:

	private val originData = MutableLiveData<String>()
	//	通过 Transformations.map 返回一个 LiveData
	val mapData = Transformations.map(originData, Function<String,String> {
   
   
    	it.plus(" World")
	})

    mapData.observe(this, Observer {
   
   
        Log.e("mapData",it)
    })
	//	点击按钮给 originData 赋值
    btn.setOnClickListener {
   
   
        originData.value = "Hello"
    }

控制台输出:
mapData: Hello World

2、转换类型

相信大家也看到了,map() 方法的第二个参数的类型有两个泛型,事实上第一个个泛型的类型是确定的,那就是对应 map() 方法第一个参数 LiveData 的泛型,那么第二个泛型就是控制返回的 LiveData 的类型。改造上面的例子:

	... ...
	val mapData = Transformations.map(originData, Function<String,Int> {
   
   
    	it.length
	})

    mapData.observe(this, Observer {
   
   
        Log.e("mapData",it.toString())
    })
	... ...

控制台输出:
mapData: 5

3、Kotlin 扩展
	... ...
	val mapData = originData.map {
   
   it.plus("world")}
	... ...

如果遇到报错:Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1,那就在模块的 gradle 中添加:

android{
   
   
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值