深入浅出RxJava(二:操作符)

第一篇blog中,我介绍了RxJava的一些基础知识,同时也介绍了map()操作符。当然如果你并没有意愿去使用RxJava我一点都不诧异,毕竟才接触了这么点。看完这篇blog,我相信你肯定想立即在你的项目中使用RxJava了,这篇blog将介绍许多RxJava中的操作符,RxJava的强大性就来自于它所定义的操作符。

首先先看一个例子:

准备工作

假设我有这样一个方法:
这个方法根据输入的字符串返回一个网站的url列表(啊哈,搜索引擎)
Observable<List<String>> query(String text); 
现在我希望构建一个健壮系统,它可以查询字符串并且显示结果。根据上一篇blog的内容,我们可能会写出下面的代码:
query("Hello, world!")
    .subscribe(urls -> {
        for (String url : urls) {
            System.out.println(url);
        }
    });
这种代码当然是不能容忍的,因为上面的代码使我们丧失了变化数据流的能力。一旦我们想要更改每一个URL,只能在Subscriber中来做。我们竟然没有使用如此酷的map()操作符!!!

当然,我可以使用map操作符,map的输入是urls列表,处理的时候还是要for each遍历,一样很蛋疼。

万幸,还有Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber:
Observable.from("url1", "url2", "url3")
    .subscribe(url -> System.out.println(url));
我们来把这个方法使用到刚才的场景:
query("Hello, world!")
    .subscribe(urls -> {
        Observable.from(urls)
            .subscribe(url -> System.out.println(url));
    });
虽然去掉了for each循环,但是代码依然看起来很乱。多个嵌套的subscription不仅看起来很丑,难以修改,更严重的是它会破坏某些我们现在还没有讲到的RxJava的特性。

改进

救星来了,他就是flatMap()。
Observable.flatMap()接收一个Observable的输出作为输入,同时输出另外一个Observable。直接看代码:
query("Hello, world!")
    .flatMap(new Func1<List<String>, Observable<String>>() {
        @Override
        public Observable<String> call(List<String> urls) {
            return Observable.from(urls);
        }
    })
    .subscribe(url -> System.out.println(url));
这里我贴出了整个的函数代码,以方便你了解发生了什么,使用lambda可以大大简化代码长度:
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .subscribe(url -> System.out.println(url));
flatMap()是不是看起来很奇怪?为什么它要返回另外一个Observable呢?理解flatMap的关键点在于,flatMap输出的新的Observable正是我们在Subscriber想要接收的。现在Subscriber不再收到List<String>,而是收到一些列单个的字符串,就像Observable.from()的输出一样。

这部分也是我当初学RxJava的时候最难理解的部分,一旦我突然领悟了,RxJava的很多疑问也就一并解决了。

还可以更好

flatMap()实在不能更赞了,它可以返回任何它想返回的Observable对象。
比如下面的方法:
// 返回网站的标题,如果404了就返回null
Observable<String> getTitle(String URL);
接着前面的例子,现在我不想打印URL了,而是要打印收到的每个网站的标题。问题来了,我的方法每次只能传入一个URL,并且返回值不是一个String,而是一个输出String的Observabl对象。使用flatMap()可以简单的解决这个问题。
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(new Func1<String, Observable<String>>() {
        @Override
        public Observable<String> call(String url) {
            return getTitle(url);
        }
    })
    .subscribe(title -> System.out.println(title));
使用lambda:
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url))
    .subscribe(title -> System.out.println(title));
是不是感觉很不可思议?我竟然能将多个独立的返回Observable对象的方法组合在一起!帅呆了!
不止这些,我还将两个API的调用组合到一个链式调用中了。我们可以将任意多个API调用链接起来。大家应该都应该知道同步所有的API调用,然后将所有API调用的回调结果组合成需要展示的数据是一件多么蛋疼的事情。这里我们成功的避免了callback hell(多层嵌套的回调,导致代码难以阅读维护)。现在所有的逻辑都包装成了这种简单的响应式调用。

丰富的操作符

目前为止,我们已经接触了两个操作符,RxJava中还有更多的操作符,那么我们如何使用其他的操作符来改进我们的代码呢?
getTitle()返回null如果url不存在。我们不想输出"null",那么我们可以从返回的title列表中过滤掉null值!
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url))
    .filter(title -> title != null)
    .subscribe(title -> System.out.println(title));
filter()输出和输入相同的元素,并且会过滤掉那些不满足检查条件的。

如果我们只想要最多5个结果:
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url))
    .filter(title -> title != null)
    .take(5)
    .subscribe(title -> System.out.println(title));
take()输出最多指定数量的结果。

如果我们想在打印之前,把每个标题保存到磁盘:
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url))
    .filter(title -> title != null)
    .take(5)
    .doOnNext(title -> saveTitle(title))
    .subscribe(title -> System.out.println(title));
doOnNext()允许我们在每次输出一个元素之前做一些额外的事情,比如这里的保存标题。

看到这里操作数据流是多么简单了么。你可以添加任意多的操作,并且不会搞乱你的代码。

RxJava包含了大量的操作符。操作符的数量是有点吓人,但是很值得你去挨个看一下,这样你可以知道有哪些操作符可以使用。弄懂这些操作符可能会花一些时间,但是一旦弄懂了,你就完全掌握了RxJava的威力。

你甚至可以编写自定义的操作符!这篇blog不打算将自定义操作符,如果你想的话,清自行Google吧。

感觉如何?

好吧,你是一个怀疑主义者,并且还很难被说服,那为什么你要关心这些操作符呢?

因为操作符可以让你对数据流做任何操作。

将一系列的操作符链接起来就可以完成复杂的逻辑。代码被分解成一系列可以组合的片段。这就是响应式函数编程的魅力。用的越多,就会越多的改变你的编程思维。


另外,RxJava也使我们处理数据的方式变得更简单。在最后一个例子里,我们调用了两个API,对API返回的数据进行了处理,然后保存到磁盘。但是我们的Subscriber并不知道这些,它只是认为自己在接收一个Observable<String>对象。良好的封装性也带来了编码的便利!


在第三部分中,我将介绍RxJava的另外一些很酷的特性,比如错误处理和并发,这些特性并不会直接用来处理数据。

原文链接
























<think>嗯,我现在要回答用户关于“3216封装钽电容16v全名”的问题。首先,我需要确认用户的问题具体指的是什么。看起来用户想知道这种钽电容的完整名称,可能包括封装尺寸、电压额定值以及其他相关参数。 首先,我应该回忆一下钽电容的基本知识。钽电容通常以它们的封装尺寸、电压、容值等参数来命名。常见的封装类型如3216,这应该是指尺寸代码,但需要确认是否正确。钽电容的封装代码通常采用EIA标准,比如3216对应的是EIA的尺寸代码,转换成毫米的话,3216可能代表3.2mm×1.6mm的尺寸,但有时候可能有不同的表示方式,比如另一种命名方式中的“A”型或“B”型封装,不过可能需要进一步核实。 接下来,电压16V应该是额定电压,也就是电容器能承受的最大电压。钽电容的电压等级通常有多个,比如6.3V、10V、16V、25V等,所以16V是一个常见的规格。 然后,全名可能包括品牌、系列、容值、公差、封装、电压等。例如,一个完整的型号可能是像KEMET的T491系列,或者其他制造商的类似产品。例如,T491B106K016AT,其中各部分可能代表:T491是系列,B是封装代码,106是容值(10µF),K是公差(±10%),016是电压(16V),A可能代表包装方式,T是包装形式。 不过用户可能不需要具体的品牌型号,而是通用的命名方式。因此,全名可能包括封装尺寸(3216)、结构(钽电容)、电压(16V),以及其他参数如容值和公差,但用户问题中未提到容值,所以可能需要解释这些部分如何构成全名。 另外,需要注意的是,3216封装可能对应不同的代码,比如EIA的3216-18(3.2mm×1.6mm),而有时候也被称为“B”型封装,例如在AVX的钽电容中,3216封装对应的是B case。因此,全名可能包括封装代码,如“3216 (B型)封装”。 总结一下,全名可能结构为:封装尺寸(3216,即EIA 3216-18或B型)+ 钽电容类型(固体钽电解电容器)+ 额定电压(16V)+ 其他参数如容值和公差(但用户未提供,所以可能需要指出这些参数通常存在)。 需要确认是否3216封装对应正确的尺寸,避免混淆。例如,3216可能有两种解释:一种是EIA的3216(3.2mm×1.6mm),另一种是公制尺寸,但通常钽电容的封装代码如A、B、C型对应不同尺寸。例如,AVX的B型是3.5mm×2.8mm,而可能3216是另一种标准,或者用户可能误用了封装代码。不过,常见的钽电容封装代码如A、B、C、D等,例如,B型对应EIA 3528-21(3.5mm×2.8mm),这可能意味着用户提到的3216可能不是标准钽电容封装代码,或者可能存在不同厂家的命名差异。 因此,可能需要指出,3216封装可能是指尺寸代码,但不同制造商可能有不同的命名方式,所以需要确认具体的制造商型号。例如,某些厂家可能将3216作为封装代码,而其他厂家可能使用不同的代码。在这种情况下,全名可能包括制造商的系列名称、封装代码、电压、容值等,但用户只提供了封装和电压,所以可能需要一般性的解释,并建议用户查阅具体的数据手册以获取完整型号。 另外,钽电容的全名可能还包括极性(钽电容是有极性的)、材料(固体或液体电解质,这里应该是固体钽电容),以及是否符合特定标准,如AEC-Q200用于汽车应用等,但可能用户不需要这些细节。 综上所述,用户的问题可能需要拆解为几个部分:封装、类型、电压,然后解释各部分的意义,并指出完整的型号通常还包括容值、公差、系列等,但基于用户提供的信息,只能给出部分名称,并建议补充其他参数以获得准确型号。</think>关于“3216封装钽电容16V”的全名,以下是逐步解析: --- ### **1. 基本定义** 这是一种**表面贴装固体钽电解电容器**,其核心特征包括: - **封装尺寸**:3216(公制代码,对应3.2mm×1.6mm的尺寸)。 - **额定电压**:16V。 - **极性**:有极性(需注意正负极方向)。 --- ### **2. 全名组成** 完整名称通常包含以下参数(以通用格式为例): ``` [封装代码]-[电容类型]-[额定电压]-[电容值]-[公差]-[附加代码] ``` 例如: $$ \text{3216B-TANT-16V-10µF-K} $$ - **3216**:封装尺寸(3.2mm×1.6mm)。 - **B**:封装类型(部分厂商用字母表示,如B型对应3216)。 - **TANT**:钽电容标识。 - **16V**:额定电压。 - **10µF**:电容值(需根据具体型号填写)。 - **K**:公差(如K=±10%)。 --- ### **3. 关键参数说明** - **封装代码**: - 3216是**公制尺寸**,对应英制代码为**1206**(长×宽:0.12英寸×0.06英寸)。 - 部分厂商可能用字母表示(如AVX的B型封装对应3.5mm×2.8mm,需注意区分)。 - **电压与容值**: - 16V为**额定电压**,实际使用需降额(通常按50%~80%设计)。 - 容值(如10µF、22µF)需根据具体型号确定。 --- ### **4. 典型型号示例** 以厂商**KEMET**或**AVX**的型号为例: - **KEMET T491B106K016AT**: - T491:系列名称(低ESR固体钽电容)。 - B:封装代码(对应3216尺寸)。 - 106:容值(10×10⁶ pF = 10µF)。 - K:公差(±10%)。 - 016:额定电压(16V)。 - A:包装形式(卷带包装)。 --- ### **5. 注意事项** - **封装混淆**:3216可能与其他标准冲突(如贴片电阻的3216封装),需通过“钽电容”标识区分。 - **选型建议**:需结合**容值、耐压、ESR、纹波电流**等参数,并参考厂商手册。 --- ### **总结** 用户提到的“3216封装钽电容16V”全名需补充具体参数(如容值、公差)才能确定唯一型号。通用名称可描述为: **3216封装(3.2mm×1.6mm)表面贴装固体钽电解电容器,额定电压16V**。 建议提供更多参数或查阅厂商手册以获取完整型号。
评论 94
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值