我应该使用什么中间方法在流调用的某个时刻执行某些操作?
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
.
forEach
是 terminal operation.
map
return 等中间操作立即修改 Stream(实际上是创建一个新的 Stream 对象)。它们代表的操作可能会在终端操作为 运行.
时执行
终端操作是针对 运行 流管道末端的操作。它们应该用于例如收集元素或做任何你需要 Stream 的事情。
调用终端操作后不能再使用 Stream。
我在服务中有一个方法可以从数据库中检索课程对象。在将它发送到 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
.
forEach
是 terminal operation.
map
return 等中间操作立即修改 Stream(实际上是创建一个新的 Stream 对象)。它们代表的操作可能会在终端操作为 运行.
终端操作是针对 运行 流管道末端的操作。它们应该用于例如收集元素或做任何你需要 Stream 的事情。
调用终端操作后不能再使用 Stream。