我应该使用什么中间方法在流调用中的某个点执行某些操作?
我在服务中有一个方法可以从数据库中检索课程对象。在将其发送到控制器之前,我需要解压缩字段 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。