前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

flatMap

原创
作者头像
Java king
发布2023-02-21 15:17:20
3290
发布2023-02-21 15:17:20
举报
文章被收录于专栏:后端Java后端Java

Stream中有这么一个函数:

先来看一下源码中的参数构造。

代码语言:java
复制
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

可以看到flatMap里只有一个参数:Function

关键在于Function中的两个泛型,注意不是TR,而是? 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

案例一:
代码语言:java
复制
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

代码语言:java
复制
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

代码语言:java
复制

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

代码语言:txt
复制

concat()Java中Stream类的方法创建一个延迟串联的流,其元素是第一个流的所有元素,然后是第二个流的所有元素。

这里,a是第一流,而b是第二流。T是流元素的类型。

直白点就是把两个流串联到一块。咱们把b通过map处理成大写然后串联,类似于合并。

Stream.sorted

代码语言:java
复制
Stream<T> sorted();

这个不过多讲解,就是排序可以自定义排序,也可以按照它默认的规则排序。

代码语言:java
复制
[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

代码语言:java
复制
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

代码语言:java
复制
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);
}

两种写法完成的效果是一样的。

代码语言:java
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 案例一:
  • 案例二:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档