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

What intermediate method should I use to perform some action at some point in the stream calls?

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

Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.

就这样称呼它:

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 是一个 terminal operation,这意味着在此之后流不能被重用。这也是为什么 forEach returns void 的原因,当然语言也是如此,所以你不能在方法后进行链式调用 returns void.

forEachterminal operation.

map return 等中间操作立即修改 Stream(实际上是创建一个新的 Stream 对象)。它们代表的操作可能会在终端操作为 运行.

时执行

终端操作是针对 运行 流管道末端的操作。它们应该用于例如收集元素或做任何你需要 Stream 的事情。

调用终端操作后不能再使用 Stream。