【发布时间】:2020-08-01 09:29:26
【问题描述】:
这是一个简化的例子,但它说明了这一点。
假设我有一个这样定义的方法:
Stream<String> generateStream() {
return Stream.of("hello", "world"); // (S)
}
有没有办法让S 例如打印一些东西在一个元素已经被消费之后,而流的消费者不必做或知道任何事情?
例如,我要修改S,这样:
generateStream().forEach(System.out::println)
实际上将其打印到控制台:
hello
consumed
world
consumed
这在 Java 8 中是否可行?如果可以,如何实现?
【问题讨论】:
-
也许你正在寻找
peek -
我可以使用“peek”将字符串打印到控制台,但我想将字符串(“consumed”)“自动”打印,而无需消费者使用 peek。并且必须在值被消耗之后完成。有点像 aspectj 中的 @After 方面。
-
流或生产者无法知道某个部分何时被消费,因为没有这样的信号从消费者返回到生产者。您只能观看数据流动。还要考虑缓冲。生产者可能已经完成,而消费者在那之后很长一段时间都在处理缓冲的内容。当您将数据复制到 U 盘时,您可能从文件管理器的进度条中知道这种效果。
-
@Stefan 我认为你的评论会是一个很好的答案:)
-
意图似乎是为每种类型的终端操作添加
Consumer,对吗?这将如何解决每个终端操作持续存在的现有关注点分离。
标签: java java-stream