This question already has answers here:
In Java streams is peek really only for debugging?
(8个答案)
2年前关闭。
因此,我有一个要处理的部分或全部对象的列表,我想记录那些已处理的对象。
考虑一个虚构的例子:
在这种情况下使用.peek()是否会被视为API的意外使用?
为了进一步说明,在this question中,关键要点是:“即使实现您的近期目标,也不要以非预期的方式使用API”。 我的问题是,从调试流直到确认整个链条均按设计要求工作并再次删除了.peek()之外,所有对peek的使用是否都是意外使用。因此,如果将其用作记录流实际处理的每个对象的方式,则被认为是意外使用。
(8个答案)
2年前关闭。
因此,我有一个要处理的部分或全部对象的列表,我想记录那些已处理的对象。
考虑一个虚构的例子:
List<ClassInSchool> classes;
classes
.stream()
.filter(verifyClassInSixthGrade())
.filter(classHasNoClassRoom())
.peek(classInSchool -> log.debug("Processing classroom {} in sixth grade without classroom.", classInSchool)
.forEach(findMatchingClassRoomIfAvailable());
在这种情况下使用.peek()是否会被视为API的意外使用?
为了进一步说明,在this question中,关键要点是:“即使实现您的近期目标,也不要以非预期的方式使用API”。 我的问题是,从调试流直到确认整个链条均按设计要求工作并再次删除了.peek()之外,所有对peek的使用是否都是意外使用。因此,如果将其用作记录流实际处理的每个对象的方式,则被认为是意外使用。
最佳答案
documentation of peek
将意图描述为
.peek(classInSchool -> log.debug("Processing classroom {} in sixth grade without classroom.", classInSchool)
形式的表达式可以满足此要求,因为它是有关报告元素处理的信息。不管使用日志记录框架还是仅使用打印语句(如文档示例.peek(e -> System.out.println("Filtered value: " + e))
)都无关紧要。在这两种情况下,意图都至关重要,而不是技术方法。如果有人使用peek
来打印所有元素,那将是错误的,即使它使用与文档示例(System.out.println
)相同的技术方法也是如此。
该文档并没有要求您必须区分生产环境或调试环境,以删除前者的peek
用法。实际上,您的使用甚至可以满足要求,因为日志记录框架允许您通过可配置的日志记录级别使该操作静音。
我仍然建议记住,对于某些管道,插入peek
操作可能会比实际操作插入更多开销(或在某种程度上阻碍JVM的循环优化)。但是,如果您没有遇到性能问题,则可以遵循旧的建议,除非有真正的原因,否则不要尝试进行优化……
09-27 04:45