RxJava之转换操作符

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战 在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联 阅读详情

    

        在 RxJava- 操作符之过滤Observables了解到,RxJava过滤操作符的基本使用,主要是针对Observable列表。本篇主要针对Observable列表中对象操作符的使用。用于变换可观测序列来创建一个能够更好的满足我们需求的序列。

map

      map操作符通过指定一个的Func对象,将Observables转换为一个新的Observable对象并发射,观察者将收到新的Observable处理。
     map操作符的流程图如下:
    
     示例代码:
    Observable.from(mLists)
        .map(new Func1<Student, Student>() {

            @Override
            public Student call(Student student) {
                StringBuilder sb = new StringBuilder();
                String age = student.getAge();
                sb.append("AGE - ");
                sb.append(age);
                student.setAge(sb.toString());
                return student;
            }
        })
        .subscribe(new Observer<Student>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Student student) {
                mAdaStu.addData(student);
            }
        });

       正如你看到的,像往常一样创建我们发射的Observable之后,追加一个map调用,在其回调call方法中,将age字段添加“AGE - ”, 更新对象后发射,观察者接收到的是更新后的Observable。

flatMap

       flatMap操作符用于发射的一个数据序列,而这些数据同时本身拥有发射Observable。flatMap是以铺平序列的方式,然后合并这些Observables发射的数据,最后将合并后的结果作为最终的Observable。但是,flatMap()可能交错的发送事件,最终结果的顺序可能并是不原始Observable发送时的顺序。
       flatMap操作符的流程图如下:
    
       示例代码:
  
    private void doFlatMap() {
        List<String> lists = new ArrayList<>();
        lists.add("Flat - A");
        lists.add("Flat - B");
        lists.add("Flat - C");
        lists.add("Flat - D");

        Observable.from(lists)
                .flatMap(new Func1<String, Observable<Student>>() {
                    @Override
                    public Observable<Student> call(String s) {
                        return getStudentData(s);
                    }
                })
                .subscribe(new Observer<Student>() {
                    @Override
                    public void onCompleted() {


                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Student student) {
                        mAdaStu.addData(student);
                    }
                });

    }

    // 针对不同的s发射不同的Observable序列
    private Observable<Student> getStudentData(final String s) {
        List<Student> lists_0 = new ArrayList<>();
        if (TextUtils.equals("Flat - A", s) || TextUtils.equals("Concat - A", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "12", "20", "1102"));
            lists_0.add(new Student(s + "13", "20", "1103"));
        } else if (TextUtils.equals("Flat - B", s) || TextUtils.equals("Concat - B", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
        } else if (TextUtils.equals("Flat - C", s) || TextUtils.equals("Concat - C", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "12", "20", "1102"));
        } else if (TextUtils.equals("Flat - D", s) || TextUtils.equals("Concat - D", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "12", "20", "1102"));
            lists_0.add(new Student(s + "13", "20", "1103"));
            lists_0.add(new Student(s + "13", "20", "1104"));
        }

        return Observable.from(lists_0);
    }


        注:
        1.flatMap允许交叉。如流程图所示,这意味着flatMap()不能够保证在最终生成的Observable中源Observables确切的发射顺序。
        2.当我们在处理可能有大量的Observables时,重要是记住任何一个Observables发生错误的情况,flatMap()将会触发它自己的onError()函数并放弃整个链。

concatMap

         concatMap操作符功能与flatMap操作符一致,不过,它解决了flatMap()的交叉问题,提供了一种能够把发射的值连续在一起的
 铺平函数,而不是合并它们,
        concatMap操作符的流程图如下:

    示例代码:
    List<String> lists = new ArrayList<>();
    lists.add("Concat - A");
    lists.add("Concat - B");
    lists.add("Concat - C");
    lists.add("Concat - D");

    Observable.from(lists)
            .concatMap(new Func1<String, Observable<Student>>() {
                @Override
                public Observable<Student> call(String s) {
                    return getStudentData(s);
                }
            })
            .subscribe(new Observer<Student>() {
                @Override
                public void onCompleted() {


                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Student student) {
                    mAdaStu.addData(student);
                }
            });


    

flatMapIterable

       flatMapIterable操作符和flatMap类似,仅有的本质不同是它将源数据两两结成对并生成Iterable,而不是原始数据项和生成的Observables。
       flatMapIterable操作符的流程图如下:
    
    示例代码:
     private void doFlatMapIterable() {
        List<String> lists = new ArrayList<>();
        lists.add("FlatMapIterable - A");
        lists.add("FlatMapIterable - B");
        lists.add("FlatMapIterable - C");
        lists.add("FlatMapIterable - D");

        Observable.from(lists)
                .flatMapIterable(new Func1<String, Iterable<Student>>() {
                    @Override
                    public Iterable<Student> call(String s) {
                        return getStudentList(s);
                    }
                })
                .subscribe(new Observer<Student>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Student student) {
                        mAdaStu.addData(student);
                    }
                });
    }

    // 针对不同的s发射不同的Observable序列
    private ArrayList<Student> getStudentList(final String s) {
        ArrayList<Student> lists_0 = new ArrayList<>();
        if (TextUtils.equals("FlatMapIterable - A", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "12", "20", "1102"));
            lists_0.add(new Student(s + "13", "20", "1103"));
        } else if (TextUtils.equals("FlatMapIterable - B", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
        } else if (TextUtils.equals("FlatMapIterable - C", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "11", "20", "1102"));
        } else if (TextUtils.equals("FlatMapIterable - D", s)) {
            lists_0.add(new Student(s + "11", "20", "1101"));
            lists_0.add(new Student(s + "12", "20", "1102"));
            lists_0.add(new Student(s + "13", "20", "1103"));
            lists_0.add(new Student(s + "13", "20", "1104"));
        }

        return lists_0;
    }


switchMap

       switchMap操作符flatMap类似,有一点不同,每当源Observable发射一个新的数据项(Observable)时,它将取消订阅并停止监视之前那个数据项产生的Observable,并开始监视当前发射的这一个。

        switchMap操作符的流程图如下:


scan

        scan操作符可以认为是一个sum函数,scan()函数对原始Observable发射的每一项数据都应用一个函数,计算出函数的结果值,并将该值填充回可观测序列,等待和下一次发射的数据一起使用。
       scan操作符的流程图如下:
    
    示例代码:
    Observable.just(1,2,3,4,5)
        .scan((sum,item) -> sum + item)
        .subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.d("RXJAVA", "Sequence completed.");
            }

            @Override
            public void onError(Throwable e) {
                Log.e("RXJAVA", "Something went south!");
            }

            @Override
            public void onNext(Integer item) {
                Log.d("RXJAVA", "item is: " + item);
            }
        });

goupBy

    goupBy操作符用于分组元素,将源Observable变换成一个发射Observables的新的Observable(分组后的)。它们中的每一个新的Observable都发射一组指定的数据。

    goupBy操作符的流程图如下:


    示例代码:
    Observable<GroupedObservable<String,Student>> groupedItems = Observable.from(mLists)
        .groupBy(new Func1<Student,String>(){
            @Override
            public String call(Student student){
                return student.getAge();
            }
        });
    Observable.concat(groupedItems)
            .subscribe(new Observer<Student>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Student student) {
                    mAdaStu.addData(student);
                }
            });

buffer

       buffer操作符将源Observable变换一个新的Observable,这个新的Observable每次发射一组列表值而不是一个一个发射。
       buffer操作符的流程图如下:        
            
    示例代码:

    仅仅指定cout

    Observable.from(mLists)
        .buffer(2)
        .subscribe(new Action1<List<Student>>() {
            @Override
            public void call(List<Student> list) {
                cout++;
                Log.i("123", "cout = " + cout);
                Log.i("123", list.toString());
                mAdaStu.addDatdLists(list);
            }
        });
    log打印
    cout = 1
    [Student(name=A11, age=26, no=1101), Student(name=A12, age=21, no=1102)]
    cout = 2
    [Student(name=A13, age=20, no=1103), Student(name=B11, age=22, no=1201)]
    cout = 3
    [Student(name=B12, age=30, no=1202), Student(name=B13, age=20, no=1203)]
    cout = 4
    [Student(name=S10, age=28, no=1301), Student(name=E10, age=30, no=1401)]
    cout = 5
    [Student(name=F10, age=26, no=1501)]

      

    查看上方的Log,可以看出将源Observable量量分组,变换为一个新的Observable,新的Observable每次发射一组列表值。

    设定count及skip

   

       查看上方的流程图,如果设定skip值以后,将源Observable按照长度为skip分组,但是又将每组前count个添入新的Observable并发射。
    示例代码:
    Observable.from(mLists)
        .buffer(2,3)
        .subscribe(new Action1<List<Student>>() {
            @Override
            public void call(List<Student> list) {
                cout++;
                Log.i("123", "cout = " + cout);
                Log.i("123", list.toString());
                mAdaStu.addDatdLists(list);
            }
        });
    //Log打印
    cout = 1
    [Student(name=A11, age=26, no=1101), Student(name=A12, age=21, no=1102)]
    cout = 2
    [Student(name=B11, age=22, no=1201), Student(name=B12, age=30, no=1202)]
    cout = 3
    [Student(name=S10, age=28, no=1301), Student(name=E10, age=30, no=1401)]

    设定count及timespan


    如果设定buffer的timespan的参数,会创建一个每隔timespan时间段就会发射一个列表的Observable。    

window        

       window操作符与Buffer操作符类似,但是它发射的是Observable而不是列表。看下方流程图,winow是缓存3个数据项并把它们作为一个新的Observable发射出去。        
       window操作符的流程图如下:
    
     示例代码:

    仅仅设定count

    Observable.from(mLists)
        .window(2)
        .subscribe(new Action1<Observable<Student>>() {
            @Override
            public void call(Observable<Student> studentObservable) {
                studentObservable.subscribe(new Action1<Student>() {
                    @Override
                    public void call(Student student) {
                        mAdaStu.addData(student);
                    }
                });
            }
        });
    //Log打印
    I: cout = 1
    I: Student(name=A11, age=26, no=1101)
    I: cout = 2
    I: Student(name=A12, age=21, no=1102)
    I: cout = 3
    I: Student(name=A13, age=20, no=1103)
    I: cout = 4
    I: Student(name=B11, age=22, no=1201)
    I: cout = 5
    I: Student(name=B12, age=30, no=1202)
    I: cout = 6
    I: Student(name=B13, age=20, no=1203)
    I: cout = 7
    I: Student(name=S10, age=28, no=1301)
    I: cout = 8
    I: Student(name=E10, age=30, no=1401)
    I: cout = 9
    I: Student(name=F10, age=26, no=1501)


    细看上方Log,window将源Observable按count缓存后,然后一一发射出去。
    

    设定count及Skip


    Observable.from(mLists)
        .window(2,3)
        .subscribe(new Action1<Observable<Student>>() {
            @Override
            public void call(Observable<Student> studentObservable) {
                studentObservable.subscribe(new Action1<Student>() {
                    @Override
                    public void call(Student student) {
                        mAdaStu.addData(student);
                    }
                });
            }
        });
    I: cout = 1
    I: Student(name=A11, age=26, no=1101)
    I: cout = 2
    I: Student(name=A12, age=21, no=1102)
    I: cout = 3
    I: Student(name=B11, age=22, no=1201)
    I: cout = 4
    I: Student(name=B12, age=30, no=1202)
    I: cout = 5
    I: Student(name=S10, age=28, no=1301)
    I: cout = 6
    I: Student(name=E10, age=30, no=1401)


        细看上方Log,window将源Observable按skip值进行缓存后,但新Observable仅仅将分组中的前count个一一发射出去。
    

cast

        cast操作符是是map()操作符的特殊版本,它将源Observable中的每一项数据都转换为新的类型,把它变成了不同的Class。

        cast操作符是是map操作符的流程图如下:


【DRAM存储器四十六】LPDDR5介绍--基本操作之行操作、读、写 简述LPDDR5的行操作和读写时序 阅读详情

相关推荐

中国城市统计年鉴1991-2024面板数据真正无缺失值填补指标说明

大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。

yushibing717的博客 928

Observable的创建

https://www.jianshu.com/p/6e9b50899522 创建Obseravble 该章节展示创建响应源的函数,例如Obseravble. Outline create defer empty error from interval just never range timer Just Available in: Flowable,Obser...

lppl010_的专栏 1040

RAG在医药行业为什么80%都翻车了?

这篇文章不是要劝你别做RAG,而是把坑说清楚。医药行业有它的特殊性——监管压力、专业术语密度、多语言混排、文档结构复杂——这些因素叠加在一起,让标准RAG教程里的那套方法论几乎直接失效

qq_31808385的博客 635

RxJava常用操作符 Observable.fromIterable

import io.reactivex.Observable val bannerItemData: ArrayList<HomeBean.Issue.Item> = mData.take(bannerItemSize).toCollection(ArrayList()) val bannerFeedList = ArrayList<Str...

u012922981的专栏 5098

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

Android-学习笔记-RxJava操作符

1 创建操作 just() — 将一个或多个对象转换成发射这个或这些对象的一个Observable fromArray(), fromFuture(),fromIterable(), — 将一个数组, 一个Future, 或者一个Iterable转换成一个Observable create() — 使用一个函数从头创建一个Observable defer() —只有当订阅者订阅才创...

zuochunsheng的博客 681

Windows下Anaconda和PyTorch深度学习环境完整安装配置教程

本文详细介绍了在Windows系统下安装配置PyTorch深度学习环境的完整流程。主要内容包括:硬件环境检查(确认GPU支持)、Anaconda环境管理系统的安装与配置、虚拟环境的创建与管理方法、以及PyTorch及其相关组件的安装指南。特别强调了版本兼容性选择策略(如CUDA版本的确定)、显卡驱动更新、使用Anaconda创建隔离的PyTorch专用环境等关键步骤。无论是使用CPU还是GPU版本,读者都能按照教程快速搭建稳定的PyTorch开发环境,为深度学习项目打下坚实基础。

FJN110的博客 973

Rxjava学习笔记(三)

变换操作符号需求是:当我们的操作是当注册成功后去登录的连贯过程Map操作符Map操作是用来转换结果的方式 Observable.create(new ObservableOnSubscribe<Integer>(){ @Override public void subscribe(ObservableEmitter<Integer> e) throws

AINewBegin的专栏 490

汽车电子 静态电流

**静态电流(Static Current 或 Quiescent Current, IQ)** 是指汽车在 **熄火 / 关机 / 睡眠模式** 下,电子控制单元(ECU)或电子元件仍然保持基本功能(RTC、存储保持、Wake-up 监测、CAN/LIN 监听等)所消耗的微弱电流。

天赐好车的博客 758

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 818

RxJava 操作符

在 RxJava 中,一个实现了 observer 接口的对象可以订阅 observable 类的实例。订阅者对 observable 发射的任何数据或者数据序列做出响应。这种模式简化了并发操作,因为它不需要阻塞等待 observable 发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应 observable 的通知。RxJava 提供了一套异步编程的 API ,并且支持链式调用,所以使用 RxJava 编写的代码的逻辑会非常简洁。

u010498248的博客 785

《SAP FICO系统配置从入门到精通共40篇》030、集成配置:FI与生产计划(PP)的自动科目确定

FI和PP的自动科目确定,本质上是把生产业务翻译成会计语言。翻译规则就藏在那些配置表里。配的时候多想一步:这个业务动作,在财务眼里是什么?是材料消耗?是产出入库?还是工费分摊?想清楚这个,再看配置界面,那些代码就不是天书了。最好的测试方式,是月底关账前,让生产部门跑一遍所有类型的生产订单。配置对不对,业务最知道。

985大学毕业,前某大厂员工,啥都会点的程序员! 574

RxJava2极速入门——Rxjava操作符详解之转换操作符

Rxjava操作符详解之转换操作符RxJava操作符:详解了Map,flatMap、concatMap、buffer、window、scan、cast、groupBy以及flatMap和concatMap的对比。

易庞宙的博客 1898

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RxJava之flatMap系列转换操作符

转载请以链接形式标明出处: 本文出自:103style的博客 转换相关的操作符 以及 官方介绍 RxJava 之 flatMap 系列 转换操作符 官方介绍 :Transforming Observables flatMap flatMapCompletable flatMapIterable flatMapMaybe flatMapObservable flatMapPublisher f...

103style 1686

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RxJava转换操作符

转载自LeiHolmes的博客[https://www.jianshu.com/p/d0d08a518cf6] 初始化数据 还是使用系列第一篇的小区与房源的例子。先初始化假数据以便实践操作符时使用。 //小区实体 public class Community { private String communityName; //小区名称 private List&amp;amp;lt;House&amp;amp;g...

tinysakura的博客 258

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RxJava系列3(转换操作符)

前面两篇文章中我们介绍了RxJava的一些基本概念和RxJava最简单的用法。从这一章开始,我们开始聊聊RxJava中的操作符Operators。

BaronTalk 1364

RxJava操作符之转换操作符(四)

上一篇文章我们学习了创建类操作符,本篇我们将一起来学习RxJava转换类操作符。所谓转换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。

LeiHolmes的博客 536

Android框架——RxJava(三)转换操作符

RxJava1.x(二)操作符详解 上一篇博客已经讲解了RxJava的API的基本使用,这里我们来学习下RxJava的另一个特性——对数据流的转换操作符。 RxJava中提供的操作符可以分为转换类操作符,过滤类操作符以及组合类操作符,接下来我将依次对这三种操作符的使用进行讲解。 一、转换类操作符 转换类操作符顾名思义,就是将上游(被观察者)发送的数据流进行转换成另外一种形式(观察者希...

boyeleven的博客 2262

RxJava—转换操作符

1.前言        在前面的一篇文章中介绍了RxJava的一些基本概念和RxJava的最简单用法,如果对这两个不是很清楚的话建议去看看RxJava—入门介绍。在本章会开始聊聊RxJava中的操作符(Operators),操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件,RxJava提供了

不忘初心 640

RxJava2系列之转换型操作符

原文首发于微信公众号:躬行之(jzman-blog),欢迎关注交流! buffer 操作符 window操作符 map操作符 groupBy操作符 cast操作符 scan操作符 To操作符 buffer 操作符 buffer 操作符重载方法比较多,这里选取典型的几个来说明 buffer 操作符的使用,buffer 操作符的使用可以分为如下三类,具体如下: //第一类 public fin...

躬行之 360

RxJava使用说明3-转换操作符

前面两篇文章中我们介绍了RxJava的一些基本概念和RxJava最简单的用法。从这一章开始,我们开始聊聊RxJava中的操作符(Operators),RxJava中的操作符主要分成了三类: 转换类操作符(map flatMap concatMap flatMapIterable switchMap scan groupBy…); 过滤类操作符(fileter take takeLast takeUntil distinct distinctUntilChanged skip skipLast …); 组合

xgw的专栏 295

Android :RxJava学习笔记之转换操作符

RxJava ——转换操作符 转换操作符1、map2、cast3、flatMap4、concatMap4.1、concatMap和flatmap对比5、flatMapIterable6、scan7、buffer8、window9、groupBy参考 转换操作符 转换类操作符顾名思义,就是将上游(被观察者)发送的数据流进行转换成另外一种形式(观察者希望接收到的形式),从而使下游(观察者)能够正确的接受并作出响应。 这里介绍map,cast,flatMap,concatMap,flatMapIterable,

JMW1407的博客 749

RxJava学习之转换型操作符

RxJava学习之转换型操作符

wuyinlei的博客 1224

RxJava3.0 操作符之转换操作符使用

RxJava 转换操作符, map flatmap

sky丶伤心欲绝的博客 549

3. RxJava转换操作符

RxJava转换操作符

NorthStar的博客 710
上一篇: RxJava之过滤操作符
下一篇: RxJava之组合操作符
行云间
博客等级 码龄12年 438粉丝 173原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值