java8 stream

℡╲_俬逩灬. 提交于 2020-10-29 16:46:43

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);

	}

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!