[英]How can I terminate a loop for input if I don't know the number of lines beforehand?
[英]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.