RxJava HashMap转换

时间:2015-09-23 09:20:50

标签: java android hashmap transformation rx-java

假设我有以下数据结构:

Map<String, ObjectA> map;

和ObjectA:

class ObjectA {
   String a;
   String b;
   int c;    
}

我的最终目标是回归:

Map<String, String>

其中第一个String与原始String相同,第二个String是'String a'。我需要进行哪些转换才能实现这一目标?

如果这是一个列表,我会使用Observable.from(),从单个项目中获取我想要的东西,然后在最后将它们与toList()连接在一起。但这是一张地图,我从来没有也不知道如何在RxJava中对地图进行迭代。任何帮助将不胜感激

编辑。我知道我可以使用Observable.create来执行此操作并使用正常的Java /方式来完成它,就像第一个回答状态一样。我真正想知道的是,是否有任何Rx操作符允许我这样做,如Observable.from,flatMap和toList,如果我正在转换列表

2 个答案:

答案 0 :(得分:15)

试试这段代码:

Observable.just(map)
        .map(stringObjectAMap -> stringObjectAMap.entrySet())
        .flatMapIterable(entries -> entries)
        .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue().a))
        .toMap(e -> e)
        .subscribe(m -> {
            //do something with map
        });

答案 1 :(得分:2)

这也可以使用java8流完成:

import java.util.HashMap;
import java.util.Map;

import static java.util.stream.Collectors.toMap;

public class Example {
    public void method() {
        Map<String, Object> map = new HashMap<String, Object>() {{
            put("a", 4);
            put("b", new Object());
            put("c", 'o');
        }};

        Map<String, String> stringMap = map.entrySet()
                .stream()
                .collect(toMap(Map.Entry::getKey, entry -> entry.getValue().toString()));
    }
}