java - 我应该使用什么中间方法在流调用中的某个点执行某些操作?
问题描述
我在服务中有一个从数据库中检索课程对象的方法。在将其发送到控制器之前,我需要解压缩字段 byte[] 徽标。Logo 是在渲染到前端之前需要从数据库中解压缩的图像。我试图用流来做到这一点,但没有任何成功。map() 方法在 forEach() 方法之后不起作用。
public List<CourseDto> getCoureses() {
List<Courses> courses = courseRepositoryDao.findAllByIsCourseFreeAndIsCourseActive(true, true);
List<CourseDto> coursesNameDto = courses
.stream()
.forEach(course-> course.setLogo(decompressZLib(course.getLogo()))
.map(course -> modelMapper.map(CourseMapper.toUserDtoFreeCourses(course), CourseDto.class))
.collect(Collectors.toList());
return coursesNameDto;
}
解决方案
采用peek(Consumer)
peek(Consumer)
存在,以便您可以在流调用中的某个点执行某些操作。所以用它代替forEach(Consumer)
.
javadoc 指出:
返回由该流的元素组成的流,并在从结果流中消耗元素时对每个元素执行提供的操作。
就这样称呼它:
public List<CourseDto> getCoureses() {
List<Courses> courses = courseRepositoryDao.findAllByIsCourseFreeAndIsCourseActive(true, true);
List<CourseDto> coursesNameDto = courses
.stream()
.peek(byteArray -> byteArray.setLogo(decompressZLib(byteArray.getLogo()))
.map(course -> modelMapper.map(CourseMapper.toUserDtoFreeCourses(course), CourseDto.class))
.collect(Collectors.toList());
return coursesNameDto;
}
为什么不起作用forEach
?
forEach
是一个终端操作,这意味着在此之后流不能被重用。forEach
这也是返回的原因void
,当然,语言使您不能在方法返回后进行链式调用void
。
推荐阅读
- java - 如何修复 concurrent.ExecutionException Caused by: java.lang.UnsupportedOperationException
- php - 从php中的数组获取HH:MM格式小时的平均时间
- yocto - 如何从 yocto rootfs 将 galcore 内核模块列入黑名单
- python-3.x - 我有带有 .xml 注释的 pascal voc 数据集。我想将其转换为 dakrnet .txt 格式。我该怎么做?
- php - Laravel 6 - `未定义的变量:值`第一次只有错误
- javascript - 浏览器扩展开发 - 将页面偏移 x 像素以显示顶部导航栏
- c# - 带参数的重定向 URL(POST 方法)
- javascript - 当 UI 文化为自动时,DateTime 值为 NULL
- c++builder - Indy 10 套接字错误 11001 找不到主机
- lotus-notes - 注释搜索:在 FTSearch 中搜索一个字段的多个单词的语法