当前位置: 首页 > 知识库问答 >
问题:

Java8:使用RxJava将映射到

燕禄
2023-03-14

我知道如何变换Map

但是我想学习如何使用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)

共有2个答案

穆锋
2023-03-14

您可以使用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();
范凡
2023-03-14

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

然后我建议使用方便的番石榴变压器:https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Maps.html#transformValues(java.util.Map、com.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的map value transformer的一个优点是,它不会重新创建地图数据结构,而是创建一个转换视图,该视图可以懒洋洋地(动态地)映射值。

如果您不想依赖番石榴,您可以简单地实现Func1

 类似资料:
  • 假设我有一个Foo对象列表。Foo上有一个属性,我必须使用它从数据源中获取Bar对象。然后我必须将每个bar对象映射回我得到bar的原始Foo对象。 我的尝试如下:

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。

  • 1)做这件事的正确方法是什么?我做错了什么? 2)流是线程安全的吗?我正在多线程环境中工作,所以我是否应该使用返回TRAAD安全集合的收集器?

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 我有4张桌子: 库存(库存ID、可用数量) 一个客户可以有多个订单,而一个订单由多个orderDetails项目组成。我正在尝试将库存项目存储在由库存项目和数量整数组成的映射中。 当我尝试以这种方式持久化它时,第一个库存项目将以1的orderID添加到Order详细信息表中。但是下一个是使用2的orderID插入的(不存在)。 有什么帮助吗?