【发布时间】:2018-05-22 11:03:37
【问题描述】:
是否可以使用 Java 8 流 API 创建在必要时才评估的流?
我是说。
我有一个处理元素列表的流,在其中一个中间操作(映射)中,我必须通过另一个流读取,并且我希望将该流放在另一个变量中,以便通过所有其他第一个流对象使用,但如果没有要处理的对象,我想避免处理第二个流。
我认为用代码检查更容易:
Message[] process(@Nullable Message[] messages) {
Stream<Function> transformationsToApply =
transformations
.stream()
.filter(transformation -> transformationIsEnabled(transformation.getLeft()))
.map(Pair::getRight);
return Arrays.stream(messages != null ? messages : new Message[0])
.filter(Objects::nonNull)
.map(agentMessage -> {
transformationsToApply.forEach(transformation -> processMessage(transformation, agentMessage));
return agentMessage;
})
.toArray(Message[]::new);
}
我的疑问是关于第一个流的生成,我想根据我处理的列表返回流,但我只想在它被使用时这样做(并且对所有消息元素使用相同的)。
任何想法..?
【问题讨论】:
-
第二个流的
.map中的操作会导致异常。流的forEach终端操作会被调用多次,这是不允许的。为什么不返回一个流,让调用者只在必要时运行.toArray? -
你应该指定
Function的类型参数,使用原始类型会禁用一些编译时类型检查。
标签: java java-stream lazy-sequences