Stream
中有这么一个函数:
先来看一下源码中的参数构造。
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
可以看到flatMap
里只有一个参数:Function
关键在于Function
中的两个泛型,注意不是T
和R
,而是? super T
和? extends Stream<? extends R>>
第一个泛型? super T
咱们可以忽略掉? super
去看,直接把它认为是泛型T
,而这个泛型T
,就是我们原来的元素。
直白点说就是,它是你的入参,是你集合里每一个元素,就是.flatMap(teacher -> studentList.stream()
的teacher
第二个泛型? extends Stream<? extends R>>
,咱们也忽略? extends
,表示你返回的类型要是Stream<R>
类型
这个R
可以和T
一样,也可以不一样。
咱们根据两个例子,仔细的去认识一下flatMap
List<String> abc = Stream.iterate('a', i -> ++i).map(String::valueOf).limit(26).flatMap(i -> Stream.concat(Stream.of(i), Stream.of(i).map(String::toUpperCase))).sorted().collect(Collectors.toList());
System.out.println(abc);
这段代码什么意思呢,咱们分开去读这块代码。
Stream.iterate
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
~~~
~~~java
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
这个方法和generate方法作用类似,都可以用来生成一个包含无限个元素的流。只不过这个方法比generate方法在使用上要更灵活。
直白点就是生成一个无限流根据limit
控制个数停止,然后通过flatMap
双通道把元素合并到一起。
Stream.concat
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
concat()
Java中Stream类的方法创建一个延迟串联的流,其元素是第一个流的所有元素,然后是第二个流的所有元素。
这里,a是第一流,而b是第二流。T是流元素的类型。
直白点就是把两个流串联到一块。咱们把b通过map
处理成大写然后串联,类似于合并。
Stream.sorted
Stream<T> sorted();
这个不过多讲解,就是排序可以自定义排序,也可以按照它默认的规则排序。
[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
stream.flatMap
List<Student> collect = teacherList.stream().filter(item -> item.getName().equals("李老师")).flatMap(teacher -> studentList.stream().filter(student -> teacher.getId().equals(student.getTechId()))).collect(Collectors.toList());
collect.forEach(System.out::println);
for
List<Student> students = new ArrayList<>();
for (Teacher teacher : teacherList) {
if (teacher.getName().equals("李老师")) {
for (Student student : studentList) {
if (teacher.getId().equals(student.getTechId())) {
students.add(student);
}
}
}
}
students.forEach(System.out::println);
}
两种写法完成的效果是一样的。
Student(id=3, name=新颖, techId=2)
Student(id=4, name=许宁, techId=2)
-------------------这是一条华丽的分割线-------------------
Student(id=3, name=新颖, techId=2)
Student(id=4, name=许宁, techId=2)
当然了stream.flatMap
写法远远不止如此,这只是两种事例。说到这里就告一段落了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。