使用Java 8流API,可以创建直到必要时才进行评估的Stream?
我的意思是。
我有一个流处理元素列表,在其中一个中间操作(映射)中,我必须阅读另一个流,并且我希望该流包含在另一个变量中,以供所有其他第一个流对象使用,但是如果没有要处理的对象,我想避免处理第二个流。
我认为使用代码更容易检查:
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);
}
我的疑问是关于第一个流生成,我想根据我处理过的列表返回流,但是我只想做是否要使用它(并且对所有消息元素都使用它)。
任何想法..?
最佳答案
流不是有状态的,因此没有简单的方法让它仅在处理第一个元素时才执行某些操作。在这种情况下,您只需检查messages
参数,如果没有任何事情要做,可以提早返回:
Message[] process(@Nullable Message[] messages) {
if (messages == null || messages.length == 0) return new Message[0];
List<Function> transformationsToApply = transformations.stream()
.filter(transformation -> transformationIsEnabled(transformation.getLeft()))
.map(Pair::getRight)
.collect(Collectors.toList());
return Arrays.stream(messages)
.filter(Objects::nonNull)
.map(agentMessage -> {
transformationsToApply.forEach(transformation -> processMessage(transformation, agentMessage));
return agentMessage;
})
.toArray(Message[]::new);
}
我还通过重用
transformationsToApply
流解决了该问题,您需要将其设为集合,然后才能对其进行多次迭代。