【问题标题】:Java8: Map<X, Y> to Map<X, Z> using RxJavaJava8:使用 RxJava 将 <X, Y> 映射到 Map<X, Z>
【发布时间】:2016-11-02 17:54:53
【问题描述】:

我知道如何使用流将Map&lt;X, Y&gt; 转换为Map&lt;X, Z&gt;,并且还有一个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)

【问题讨论】:

  • 你为什么要用 RxJava 做这个?如果您已经拥有所有可用数据,那么任何传统方法都应该有效。
  • 我正在尝试学习如何使用 RxJava,我遇到了这个问题,想知道是否可以使用 RxJava 来解决。

标签: java dictionary hashmap rx-java


【解决方案1】:

我认为 Dávid Karnok 在某种意义上是正确的,如果您的唯一目标是转换单个地图,这对于 RxJava 并不是特别有用。 如果你有(多个)地图的 Observable 可能更有意义。

那么我会推荐使用 Guava 转换器的便利: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 的地图值转换器的一个好处是它不会重新创建地图数据结构,而是创建一个转换后的视图,该视图会延迟(动态)映射值。

如果你不想依赖 Guava,你可以自己简单地实现Func1&lt;Map&lt;String,String&gt;,Map&lt;String,Integer&gt;&gt;。

【讨论】:

    【解决方案2】:

    您可以使用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();
    

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多