如果我不需要终止的任何价值,我该如何终止流?

How can I terminate a Stream if I don't need any value from termination?

我有一个 Stream 以 peek() 方法进行所有处理。我不需要流的任何结果,但我需要终端操作才能进行处理。当然,我可以使用 count()(或任何其他操作)终止 Stream,但这会产生误导,好像我需要 Stream 终止的一些结果。在这种情况下终止 Stream 的正确方法是什么?

参考代码如下:

Stream<Collection<NetworkPart>> graphHolders = cutSegment.stream()
    .map(this::obtainCollectionFor);
for (NetworkPart part : edgesToNetworkParts.get(originalSegment)) {
    part.integrate(cutSegment);
    graphHolders = graphHolders.peek(gh -> gh.add(part));
}
graphHolders.count(); // Just to terminate

您可以将 allMatch() 用作终端操作,因为不需要对所有元素进行评估。

如果只是 'misleading' 让您厌烦,试试这个:

private static void terminateStream(Stream<?> stream) { 
    stream.forEach(e -> {});
}

我认为这会消除任何歧义:方法有明确的目的,调用也很明确。如下使用时,

public static void main(String[] args) {
    Stream<String> stream = Arrays.asList("a", "b", "c").stream();
    stream = stream.peek(str -> System.out.println(str));
    terminateStream(stream);
}

主要方法将打印

a
b
c

这确实需要stream没有关闭并且没有被操作,否则会抛出IllegalStateException

这就是我重写问题代码的方式:

Collection<NetworkPart> partsOwningEdge = edgesToNetworkParts.get(originalSegment);
partsOwningEdge.forEach(part -> part.integrate(cutSegment));
cutSegment.stream()
    .map(this::obtainCollectionFor)
    .forEach(gh -> gh.addAll(partsOwningEdge));