如果我不需要终止的任何价值,我该如何终止流?
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));
我有一个 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));