簡體   English   中英

如果我不需要終止任何值,我該如何終止Stream?

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

我有一個使用peek()方法完成所有處理的Stream。 我不需要Stream的任何結果,但我需要終端操作才能進行處理。 當然我可以使用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

這就是我從問題中重寫代碼的方式:

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

如果它只是讓你感到厭煩的“誤導”,試試這個:

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

您可以使用allMatch()作為終端操作,因為不需要對所有元素進行評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM