java - 如何在rxjava中使用toMap()获取索引

标签 java rx-java

我想将List更改为List,然后映射为Map。 关键是“img”+index,我该怎么做。

示例: 来自列表 ["a", "b", "c"] 映射 {"img1": "a", "img2": "b", "img3": "c"}

Observable.from((Bitmap[])bitmapList.toArray())
            .subscribeOn(Schedulers.io())
            .map(new Func1<Bitmap, String>() {
                @Override
                public String call(Bitmap bitmap) {
                    return doSomething(bitmap);
                }
            })
            .toMap(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return "img"; // how to got the index
                }
            })
            ...;

最佳答案

为了将值与索引组合起来,您需要一些内部状态:您需要跟踪流中的计数器。您可以使用 scan 来执行此操作运算符(operator)。因为您需要跟踪计数器实际值,所以我们首先需要引入一个可以保存两个值的简单类:

private static class Tuple<T, S> {

    final T first;
    final S second;

    Tuple(T k, S v) {
        this.first = k;
        this.second = v;
    }
}

scan 运算符需要两个参数:状态的初始值和累加器函数,该函数采用先前的状态和新值并将它们转换为新状态。初始状态很简单,它是空字符串("")和初始索引(取决于您要启动的索引,0 >1。累加器现在很简单:它获取新值并从之前的状态增加计数器,并将它们组合在一个新的元组中。

因为初始状态不是您想要在此处看到的,所以您需要执行 skip(1) 来删除第一个发出的元素。

最后你可以做toMap,但你需要采用带有两个参数的版本:keySelectorvalueSelector,你可以在其中获得键和值分别来自Tuple

最终代码如下:

public static void main(String[] args) {
    Observable.from(Arrays.asList("a", "b", "c"))
            .scan(new Tuple<>("", 0), (tuple, s) -> new Tuple<>(s, tuple.second + 1))
            .skip(1)
            .toMap(tuple -> "img" + tuple.second, tuple -> tuple.first)
            .subscribe(System.out::println);
}

请注意,scanskip 的这种组合实际上是 zipWithIndex,正如 RxScala 中所调用的那样。 Java 语言中没有元组,因此您无法直接执行此操作,但您必须创建自己的 Tuple 类才能使其工作。

关于java - 如何在rxjava中使用toMap()获取索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879035/

相关文章:

android - 是否可以重新订阅 Retrofit 2 observable?

java - 从 Flowable 一次发出一个列表项

java - 调试Spring配置不起作用

java - 如何在 Flowable 上执行操作

java - RxJava 观察调用/订阅线程

android - 如果只有一个 Observable 参数存在,如何使用 RxJava Observable.zip

java在随机数生成器中给我15个数字而不是14个

java ;尝试将包含 ISO-8859-1 编码的字符串转换为 UTF-8 但文件是 UTF-8

java - 如何使用 Apache Ant 以 UTF-8 编码 Java 文件?

java - android studio上的程序不能在旧设备(android 6及以下)上运行,有没有指定最低版本的功能?,