天天看點

RxJava 操作符map

RxJava系列教程:

​​1. RxJava使用介紹​​​ ​​【視訊教程】​​​

​​​2. RxJava操作符​​​

  ​​​• Creating Observables(Observable的建立操作符)​​​ ​​【視訊教程】​​​

  ​​​• Transforming Observables(Observable的轉換操作符)​​​ ​​【視訊教程】​​​

  ​​​• Filtering Observables(Observable的過濾操作符)​​​ ​​【視訊教程】​​​

  ​​​• Combining Observables(Observable的組合操作符)​​​ ​​【視訊教程】​​​

  ​​​• Error Handling Operators(Observable的錯誤處理操作符)​​​ ​​【視訊教程】​​​

  ​​​• Observable Utility Operators(Observable的輔助性操作符)​​​ ​​【視訊教程】​​​

  ​​​• Conditional and Boolean Operators(Observable的條件和布爾操作符)​​​ ​​【視訊教程】​​​

  ​​​• Mathematical and Aggregate Operators(Observable數學運算及聚合操作符)​​​ ​​【視訊教程】​​​

  ​​​• 其他如observable.toList()、observable.connect()、observable.publish()等等;​​​ ​​【視訊教程】​​​

​​​3. RxJava Observer與Subcriber的關系​​​ ​​【視訊教程】​​​

​​​4. RxJava線程控制(Scheduler)​​​ ​​【視訊教程】​​​

​​​5. RxJava 并發之資料流發射太快如何辦(背壓(Backpressure))​​​ ​​【視訊教程】​​

map名詞是地圖的意思,那麼這樣了解這個操作符就很想不通這個操作符的 應用場景了,但我們敲代碼的不可能不熟悉這一個資料結構.

在我使用這個操作符的了解中,map就是變換需要操作的資料内容或者結構的意思。是以其使用場景顯而易見:當原始資料不能滿足我們的需求,但我們卻需要依賴這一原始資料去擷取滿足我們需求的資料時,那麼就用它,準沒錯。

假如有下面場景:

我有一個圖檔url集合,但我的需求卻是依次擷取到bitmap,顯示在ImageView中,那麼用該操作符就能解決問題了

官方文檔原文:

transform the items emitted by an Observable by applying a function to each item.

我的了解:

通過使用map中的方法對Observable中發射出來的所有資料進行變換.(翻譯如有錯誤,望指正)

​​​ReactiveX 官方文檔-map​​

RxJava 操作符map

下面通過一段僞代碼了解下。

Observable
.from(filePathStrS)// String[] filePathStrS :本地圖檔路徑數組 
.map(new Func1<String, Bitmap>() {
    @Override
    public Bitmap call(String s) {
        return Utils.getBitmapFromFile(photoPath + s);//通過map将String變換成Bitmap
    }
})
.filter(new Func1<Bitmap, Boolean>() {
    @Override
    public Boolean call(Bitmap bitmap) {
        return bitmap != null;//篩選掉空檔案
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
    @Override
    public void call(Bitmap bitmap) {//主線程顯示資料
        questionBitmapList.set(questionInPicCount, bitmap);
        QuestionShowAdapter.notifyDataSetChanged();

    }
}, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
        throwable.printStackTrace();
    }
}, new Action0() {
    @Override
    public void call() {
    }
});      

另一種了解:map操作符的作用就是将一個事件轉換成另一個事件

舉個例子, 比如說: 伺服器現在傳回了一段字元串,我需要将字元串重新拼接成新的字元串,并加載資料。

這時,我們就可以通過map操作。

Observable.just(url).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return "http://www.baidu.com/" + s;
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                mTextView.setText(s);
            }
        });
        //如果你有lamdba
        Observable.just(url).map(f -> "http://www.baidu.com/" + f).subscribe(t -> mTextView.setText(t));      

map操作符的特點是: 你傳遞一個Observable對象給他, 他傳回你一個Observable對象, 但是不需要對應Observable的傳回類型。

RxJava 操作符map

舉個例子: 每個子產品傳遞一個url給底層網絡請求您架構, 然後底層架構需要将url進行變換, 比如: 添加host。 那麼我們就可以通過map來實作。

public static final String HOST = ;

    @Bind(R.id.first_wb)
    WebView mWb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Observable.just("jys1115/article/details/47428843").map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return HOST + s;
            }
        }).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return doNetTask(s);
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        mWb.loadDataWithBaseURL(HOST, s, "text/html", "utf-8", null);
                    }
                });
    }

    private String doNetTask(String s) {

        HttpClient client = new DefaultHttpClient();

        HttpGet get = new HttpGet(s);
        String result;
        try {
            HttpResponse response = client.execute(get);

            if (200 == response.getStatusLine().getStatusCode()) {
                result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
            } else {
                result = "狀态行非200";
            }

        } catch (Exception e1) {
            result = e1.getStackTrace().toString();
        }
        return      

map确實是個好東西。

補充: