2016-06-30 9 views
1

を使用して をマッピングするために、それはまたこのことについて previous questionがありました。
Java8:地図<X, Y>は、私は、ストリームを使用して<code>Map<X, Y></code><code>Map<X, Z></code>に変換する方法を知っているRxJava

しかし、私は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

なぜRxJavaでこれをやりたいのですか?すべてのデータがすでに利用可能な場合は、伝統的な方法が有効です。 – akarnokd

+0

RxJavaの使い方を勉強しようとしています。この問題が発生し、RxJavaを使って解決できるかどうか疑問に思っています。 –

答えて

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(); 
2

私はデビッドKarnokがあなたの唯一の目標は、単一のマップを変換する場合、それはRxJavaのために特に有用そうではないという意味では正しいと思います。 Observable of(multiple)mapsを持っているともっと意味があるかもしれません。

それから私はグアバの変圧器の利便性を使用することをお勧めします:グアバのマップ値変圧器について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>>を自明に実装することができます。

関連する問題