本文基于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。