我知道如何使用流将Map<X, Y>
转换为Map<X, Z>
,而且还有一个previous question。
但我想了解如何使用RxJava。
更具体一点:
//Input:
Map<String,String> in; // map from key to a string number, for example: "10"
//transform: in -> out
//Output:
Map<String,Integer> out; //map from the same key to Integer.parseInt(val) (invariant: val is a string number)
答案 0 :(得分:2)
我认为DávidKarnok在某种意义上是正确的,如果您的唯一目标是转换单个地图,那么它对RxJava来说并不是特别有用。 如果您有(多个)地图的Observable可能会更有意义。
然后我建议使用方便的番石榴变形金刚:https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Maps.html#transformValues(java.util.Map,%20com.google.common.base.Function)
Map<String,String> source1 = ...
Map<String,String> source2 = ...
Observable.just(source1, source2)
.map(map->Maps.transformValues(map, v->Integer.parseInt(v)));
Guava的地图值变换器的一个好处是它不会重新创建地图数据结构,而是创建一个变换的视图,它可以懒惰地(动态地)映射值。
如果您不想依赖番石榴,您可以自己轻松实施Func1<Map<String,String>,Map<String,Integer>>
。
答案 1 :(得分:1)
您可以使用Observable.toMap
。
我认为这是一个很小的例子:
Map<String, String> test = new HashMap<String, String>() {
{
put("1", "1");
put("2", "2");
}
};
Map<String, Integer> res = Observable.from(test.entrySet()).toMap(e -> e.getKey(), e -> Integer.parseInt(e.getValue())).toBlocking().first();