使用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流解决了该问题,您需要将其设为集合,然后才能对其进行多次迭代。

10-07 16:03
查看更多