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

问题描述

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

标签: javalambdafunctional-programmingjava-streamfunctional-interface

解决方案


采用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


推荐阅读