我应该使用什么中间方法在流调用中的某个点执行某些操作?

我在服务中有一个方法可以从数据库中检索课程对象。在将其发送到控制器之前,我需要解压缩字段 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


以上是我应该使用什么中间方法在流调用中的某个点执行某些操作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>