山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

リアクティブプログラミング検証

ループ処理しているところをRxJavaでストリームAPI的に書いたらどうよくなるか?を検証してみるために試しにやってみました。

元コード

for (String itemId: itemIds) {
    HashMap<String, String> hashMap = new HashMap<>();
 
    Item item = DatabaseManager.getInstance().getItemByItemId(itemId);
    if (isOld(item)) {
        item.needReload = true;
 
        hashMap.put("itemId", itemId);
        if (item.getJsonUpdateDate() != null && !"".equals(item.getJsonUpdateDate())) {
            hashMap.put("jsonUpdateDate", item.getJsonUpdateDate());
        }
 
        parameterForNeedRefreshItemApi.add(hashMap);
    }
 
    mItems.add(item);
}

RxJava

Observable.from(itemIds)
        .map(itemId -> {
            Item item = DatabaseManager.getInstance().getItemByItemId(itemId);
            mItems.add(item);
            return item;
        })
        .filter(item -> isOld(item))
        .subscribe(item -> {
            item.needReload = true;
            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("itemId", item.getItemId());
            if (item.getJsonUpdateDate() != null && !"".equals(item.getJsonUpdateDate())) {
                hashMap.put("jsonUpdateDate", item.getJsonUpdateDate());
            }
            parameterForNeedRefreshItemApi.add(hashMap);
        });

とてもかっこよくなりました。しかしすごくメリットがあるかというとそうでもなく作った人でない人がメンテすることを考えたりするとforのほうがわかりやすかったりするかもしれないと思いました。非同期処理を伴う場合はだいぶすっきり書けてメリットが大きいのでそういう場合に使うとよさそうです。その場合でもFragmentをまたいであるイベントから画面を更新しようとした場合にどういうふうに実装したらいいのか引き続き調べないといけません。今はEventBusを使い始めましたがリアクティブプログラミングの本来の考え方としてはそういう場合にこそ使うもののように思えます。