反应式编程之flux concatmap

2022-03-28 20:17:54 浏览数 (3)

本文基于project reactor,,reactor-bom版本为Dysprosium-SR4,flux concatMap方法作用是将多个publisher组合起来,然后依次消费,消费的顺序跟传入的顺序相同,消费完一个publisher后才开始消费下一个publisher,下面看个例子

代码语言:javascript复制
	@Test
	public void concatmap(){
		Student st1 = new Student("张三",90);
		Student st2 = new Student("李四",91);
		Student st3 = new Student("王二",87);
		Student st4 = new Student("李逵",97);
		Student st5 = new Student("宋江",85);
		List<Student> list1 = new ArrayList<>();
		list1.add(st1);
		list1.add(st2);
		list1.add(st5);
		List<Student> list2 = new ArrayList<>();
		list2.add(st3);
		list2.add(st4);
		Teacher t1 = new Teacher();
		t1.setStudents(list1);
		Teacher t2 = new Teacher();
		t2.setStudents(list2);
		List<Teacher> teachers = new ArrayList<>();
		teachers.add(t1);
		teachers.add(t2);
		Flux.fromIterable(teachers).concatMap(t->Flux.fromIterable(t.getStudents()))
		.sort((s1,s2)->s1.getScore()-s2.getScore())
		.subscribe(System.out::println);
	}

上面例子的作用是排序甲乙两名老师下面学生成绩,输出结果如下所示:

名字:宋江 成绩:85 名字:王二 成绩:87 名字:张三 成绩:90 名字:李四 成绩:91 名字:李逵 成绩:97

可以看出上面是按照升序排列的,如果想降序排列,只需修改sort方法里传入的Comparator lambda表达式即可,从concatMap字面上可以看出这是concat跟map两个单词的拼写,在实际功能上也确实如此,concatMap将传入的数据进行了转换,转换后的数据流拼接起来作为一个新的publisher。

0 人点赞