王学岗RxJava(十五)——map,flatmap等交换方法

来源:互联网 发布:appium ios python 编辑:程序博客网 时间:2024/06/07 16:40

看下我们在十四中提到过的过滤方法这里写图片描述
还有很多方法我就不一一更新了,大家可以去我推荐的那两篇文章里面找。
我们现在有这样的一个需求,打印输出一组用户名;我们先看下传统的方法怎么实现
看下User类,非常简单

package com.example.acer.rxjavatest;/** * @author w_x_g * @time 2016/11/14 9:50 * @note ${TODO} */public class User {    private String name;    private String id;    public User(String name, String id) {        this.name = name;        this.id = id;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
 package com.example.acer.rxjavatest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.ArrayList;import java.util.List;import rx.Observable;import rx.Observer;//需求,打印一组用户名public class MainActivity extends AppCompatActivity {    private List<User> mUserList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initDate();    }    private void initDate() {        mUserList = new ArrayList<>();        for(int i=0;i<6;i++){            mUserList.add(new User("张欣"+i,String.valueOf(i)));}            Observable.from(mUserList).subscribe(new Observer<User>() {                @Override                public void onCompleted() {                }                @Override                public void onError(Throwable e) {                }                @Override                public void onNext(User user) {                    Log.i("zhang_xin",user.getName());                }            });        }    }

看下运行效果:这里写图片描述
下面我们使用map()把User对象转化为String对象

package com.example.acer.rxjavatest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.ArrayList;import java.util.List;import rx.Observable;import rx.functions.Action1;import rx.functions.Func1;//需求,打印一组用户名public class MainActivity extends AppCompatActivity {    private List<User> mUserList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initDate();    }    private void initDate() {        mUserList = new ArrayList<>();        for(int i=0;i<6;i++){            mUserList.add(new User("张欣"+i,String.valueOf(i)));}        //User:使我们原本的类型,String使我们要转换成的类型            Observable.from(mUserList).map(new Func1<User, String>() {                @Override                public String call(User user) {                    //这里返回的值就是aaa处要打印的值                    return user.getName();                }            }).subscribe(new Action1<String>() {                @Override                public void call(String s) {                    //aaa                    Log.i("zhang_xin","转换之后的值:"+s);                }            });        }    }

看下运行效果:
这里写图片描述
现在我们又增加了新的需求:User里面我们需要存放订单列表,这个时候我需要打印订单单号;
首先我们增加OrderModel类并在User类里面增加订单号这一成员变量;
OrderModel类:

package com.example.acer.rxjavatest;/** * @author w_x_g * @time 2016/11/14 10:39 * @note ${TODO} */public class OrderModel {    private String orderId;    private String orderName;    public OrderModel(String orderId, String orderName) {        this.orderId = orderId;        this.orderName = orderName;    }    public String getOrderId() {        return orderId;    }    public void setOrderId(String orderId) {        this.orderId = orderId;    }    public String getOrderName() {        return orderName;    }    public void setOrderName(String orderName) {        this.orderName = orderName;    }}

User类

package com.example.acer.rxjavatest;import java.util.List;/** * @author w_x_g * @time 2016/11/14 9:50 * @note ${TODO} */public class User {    private String name;    private String id;    private List<OrderModel> orderList;    public List<OrderModel> getOrderList() {        return orderList;    }    public void setOrderList(List<OrderModel> orderList) {        this.orderList = orderList;    }    public User(String name, String id, List<OrderModel> orderList) {        this.name = name;        this.id = id;        this.orderList = orderList;    }    public User(String name, String id) {        this.name = name;        this.id = id;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

我们使用map方法进行转换:

package com.example.acer.rxjavatest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.ArrayList;import java.util.List;import rx.Observable;import rx.functions.Action1;import rx.functions.Func1;//需求,打印一组用户名public class MainActivity extends AppCompatActivity {    private List<User> mUserList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initDate();    }    private void initDate() {        mUserList = new ArrayList<User>();        for(int i=0;i<6;i++){         User user=new User("user_id"+i,"user_name"+i);            List<OrderModel> orderList=new ArrayList<OrderModel>();            for(int j=0;j<5;j++){                OrderModel orderModel=new OrderModel("User_id:"+i+",Order_id:"+j,"User_id:"+i+",Order_Name:"+j);                orderList.add(orderModel);            }            user.setOrderList(orderList);            mUserList.add(user);        }        //User:使我们原本的类型,List<OrderModel>使我们要转换成的类型            Observable.from(mUserList).map(new Func1<User, List<OrderModel>>() {                @Override                public List<OrderModel> call(User user) {                    //这里返回的值就是aaa处要打印的值                    return user.getOrderList();                }            }).subscribe(new Action1<List<OrderModel>>() {                @Override                public void call(List<OrderModel> s) {                    //aaa                    //这里需要遍历,才能转化为String类型                   for(OrderModel o:s){                       Log.i("zhang_xin",o.getOrderId());                   }                }            });        }    }

看先打印输出效果
这里写图片描述

我们使用flatmap()方法,不需要遍历就可以转化为String类型

package com.example.acer.rxjavatest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.ArrayList;import java.util.List;import rx.Observable;import rx.functions.Action1;import rx.functions.Func1;//需求,打印一组用户名public class MainActivity extends AppCompatActivity {    private List<User> mUserList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initDate();    }    private void initDate() {        mUserList = new ArrayList<User>();        for(int i=0;i<6;i++){         User user=new User("user_id"+i,"user_name"+i);            List<OrderModel> orderList=new ArrayList<OrderModel>();            for(int j=0;j<5;j++){                OrderModel orderModel=new OrderModel("User_id:"+i+",Order_id:"+j,"User_id:"+i+",Order_Name:"+j);                orderList.add(orderModel);            }            user.setOrderList(orderList);            mUserList.add(user);        }        //User:使我们原本的类型,转换成的类型我们使用Observable            Observable.from(mUserList).flatMap(new Func1<User, Observable<OrderModel>>() {                @Override                public Observable<OrderModel> call(User user) {                    return Observable.from(user.getOrderList());                }            }).subscribe(new Action1<OrderModel>() {                @Override                public void call(OrderModel orderModel) {                    Log.i("zhang_xin",orderModel.getOrderId());                }            });        }    }

看下打印结果:
跟使用map方法打印输出的结果一样

0 0