RxJava HashMap 转换
RxJava HashMap Transformation
假设我有以下数据结构:
Map<String, ObjectA> map;
和对象 A:
class ObjectA {
String a;
String b;
int c;
}
我的最终目标是 return 只是:
Map<String, String>
其中第一个String与原来相同,第二个String为'String a'。我需要进行哪些转换才能完成此操作?
如果这是一个列表,我会使用 Observable.from(),从单个项目中取出我想要的,然后在最后使用 toList() 将它们连接在一起。但这是一张地图,我从来没有也不知道如何在 RxJava 中对地图执行迭代。任何帮助将不胜感激
编辑。我知道我可以使用 Observable.create 来做到这一点,并像第一个答案那样使用正常的 Java/way 来做到这一点。我真正想知道的是是否有任何 Rx 运算符允许我这样做,比如 Observable.from、flatMap 和 toList,如果我正在转换列表
试试这个代码:
Observable.just(map)
.map(stringObjectAMap -> stringObjectAMap.entrySet())
.flatMapIterable(entries -> entries)
.map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue().a))
.toMap(e -> e)
.subscribe(m -> {
//do something with map
});
这也可以使用 java8 流来完成:
import java.util.HashMap;
import java.util.Map;
import static java.util.stream.Collectors.toMap;
public class Example {
public void method() {
Map<String, Object> map = new HashMap<String, Object>() {{
put("a", 4);
put("b", new Object());
put("c", 'o');
}};
Map<String, String> stringMap = map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, entry -> entry.getValue().toString()));
}
}
假设我有以下数据结构:
Map<String, ObjectA> map;
和对象 A:
class ObjectA {
String a;
String b;
int c;
}
我的最终目标是 return 只是:
Map<String, String>
其中第一个String与原来相同,第二个String为'String a'。我需要进行哪些转换才能完成此操作?
如果这是一个列表,我会使用 Observable.from(),从单个项目中取出我想要的,然后在最后使用 toList() 将它们连接在一起。但这是一张地图,我从来没有也不知道如何在 RxJava 中对地图执行迭代。任何帮助将不胜感激
编辑。我知道我可以使用 Observable.create 来做到这一点,并像第一个答案那样使用正常的 Java/way 来做到这一点。我真正想知道的是是否有任何 Rx 运算符允许我这样做,比如 Observable.from、flatMap 和 toList,如果我正在转换列表
试试这个代码:
Observable.just(map)
.map(stringObjectAMap -> stringObjectAMap.entrySet())
.flatMapIterable(entries -> entries)
.map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue().a))
.toMap(e -> e)
.subscribe(m -> {
//do something with map
});
这也可以使用 java8 流来完成:
import java.util.HashMap;
import java.util.Map;
import static java.util.stream.Collectors.toMap;
public class Example {
public void method() {
Map<String, Object> map = new HashMap<String, Object>() {{
put("a", 4);
put("b", new Object());
put("c", 'o');
}};
Map<String, String> stringMap = map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, entry -> entry.getValue().toString()));
}
}