复制流以避免“流已作或已关闭”
我想复制一个Java 8流,这样我就可以处理它两次。我可以作为一个列表,并从中获取新的流;collect
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
但我认为应该有一种更有效/更优雅的方式。
有没有办法复制流而不将其转换为集合?
我实际上正在处理一个s流,所以想要在移动到右侧投影之前以一种方式处理左投影,并以另一种方式处理它。有点像这样(到目前为止,我被迫使用这个技巧)。Either
toList
List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList());
Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left());
failures.forEach(failure -> ... );
Stream<A> successes = results.stream().flatMap(either -> either.right());
successes.forEach(success -> ... );