map和faltMap的共同点和区别
共同点
- 都是依赖FuncX(入参,返回值)进行转换(将一个类型依据程序逻辑转换成另一种类型,根据入参和返回值)
- 都能在转换后直接被subscribe
区别
- map返回的是结果集,flatmap返回的是包含结果集的Observable(返回结果不同)
- map被订阅时每传递一个事件执行一次onNext方法,flatmap多用于多对多,一对多,再被转化为多个时,一般利用from/just进行一一分发,被订阅时将所有数据传递完毕汇总到一个Observable然后一一执行onNext方法(执行顺序不同)>>>>(如单纯用于一对一转换则和map相同)
- map只能单一转换,单一只的是只能一对一进行转换,指一个对象可以转化为另一个对象但是不能转换成对象数组(map返回结果集不能直接使用from/just再次进行事件分发,一旦转换成对象数组的话,再处理集合/数组的结果时需要利用for一一遍历取出,而使用RxJava就是为了剔除这样的嵌套结构,使得整体的逻辑性更强。)
- flatmap既可以单一转换也可以一对多/多对多转换,flatmap要求返回Observable,因此可以再内部进行from/just的再次事件分发,一一取出单一对象(转换对象的能力不同)
代码演示
/**
*
*/
package demo.test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author sunkai
*
*/
public class MapTest {
static Function<Map<?, ?>, List<?>> flatMapFn = m -> {
return m.values()//
.stream() //
.flatMap(it -> {
Object[] objs;
if (it instanceof Map) {
// 递归
objs = MapTest.flatMapFn.apply((Map<?, ?>) it).toArray();
} else {
objs = new Object[] { it };
}
return Arrays.stream(objs);
}).collect(Collectors.toList());
};
public static void main(String... strings) {
var words = new String[] { "Hello", "World" };
// map得到结果: [ [H,e,l,o] , [W,o,r,l,d] ]
var list = Arrays.asList(words).stream()//
.map(w -> w.split("")) //
.distinct()//
.collect(Collectors.toList());
System.out.println(list);
// map得到结果: [H, e, l, o, W, r, d]
var list2 = Arrays.asList(words).stream()//
.map(w -> w.split("")) //
.flatMap(w -> Arrays.stream(w)) // 对结果进行展开
.distinct()//
.collect(Collectors.toList());
System.out.println(list2);
// 简化 list2
var list3 = Arrays.asList(words).stream()//
.flatMap(s -> Arrays.stream(s.split("")))// 将上面split拆分的方法放在此处
.distinct()//
.collect(Collectors.toList());
System.out.println(list3);
// 获取Map中的所有value
@SuppressWarnings("serial")
Map<String, Object> root = new HashMap<>() {
{
put("k1", "var1");
put("k2", new HashMap<>() {
{
put("k2_1", "var2_1");
put("k2_2", "var2_2");
put("k2_3", new HashMap<>() {
{
put("k2_3_1", "v2_3_1");
}
});
}
});
put("k4", "var4");
}
};
// 输出 [var1, var2_1, {k2_3_1=v2_3_1}, var2_2, var4]
var list4 = root.values()//
.stream() //
.flatMap(it -> {
if (it instanceof Map) {
return Arrays.stream(((Map<?, ?>) it).values().toArray());
} else {
return Arrays.stream(new Object[] { it });
}
}).collect(Collectors.toList());
System.out.println(list4);
// [var1, var2_1, v2_3_1, var2_2, var4]
var list5 = flatMapFn.apply(root);
System.out.println(list5);
}
}
来源:oschina
链接:https://my.oschina.net/jaakan/blog/4694492