我想将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
,但你需要采用带有两个参数的版本:keySelector
和valueSelector
,你可以在其中获得键和值分别来自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);
}
请注意,scan
和 skip
的这种组合实际上是 zipWithIndex
,正如 RxScala 中所调用的那样。 Java 语言中没有元组,因此您无法直接执行此操作,但您必须创建自己的 Tuple
类才能使其工作。
关于java - 如何在rxjava中使用toMap()获取索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879035/