我有以下几点:
LinkedList<Integer> ints = new LinkedList();
//fill it with some ints
Stream<Integer> stream = ints.stream();
//process the stream in some way我的问题是,是否可以保证流的处理顺序与底层LinkedList的顺序相同?我读了documentation,但没有任何关于订购的信息。
在我的例子中,关键是要保持秩序。
发布于 2016-07-08 18:48:49
流可能具有定义的相遇顺序,也可能没有。流是否具有相遇顺序取决于源和中间操作。某些流源(如列表或数组)本质上是有序的,而其他流源(如HashSet)则不是。一些中间操作,如sorted(),可能会对原本无序的流施加相遇顺序,而其他操作可能会使有序流变得无序,如BaseStream.unordered()。此外,一些终端操作可能会忽略相遇顺序,例如forEach()。
如果流是有序的,则大多数操作被约束为按元素的相遇顺序进行操作;如果流的源是包含1、2、3的列表,则执行map(x -> x* 2 )的结果必须为2、4、6。但是,如果源没有定义相遇顺序,则值2、4、6的任何排列都将是有效结果。
对于顺序流,相遇顺序的存在或不存在不会影响性能,只会影响确定性。如果流是有序的,则在相同的源上重复执行相同的流管道将产生相同的结果;如果未排序,则重复执行可能会产生不同的结果。
对于并行流,放松排序约束有时可以实现更有效的执行...
此外,正如您所提到的,处理顺序对您很重要,请参阅here
如果流操作的行为参数是有状态的,则
流管道结果可能是不确定的或不正确的...
最好的方法是完全避免流操作的有状态行为参数;通常有一种方法可以重构流管道以避免有状态。
另请参阅此问题的答案:How to ensure order of processing in java8 streams?
简而言之,如果你使用顺序流(在一个线程中执行的流),如果你对forEach()这样的操作很小心,看起来你可以保持顺序。然而,这可能不是一个好主意。
发布于 2016-07-08 16:45:29
取决于您应用于流的处理...尤其是使用并行()
import java.util.LinkedList;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class Streaming {
public static void main(String[] args) {
LinkedList<Integer> ints = new LinkedList();
for(int i = 0 ; i < 100; i++) {
ints.add(i);
}
Stream<Integer> stream = ints.stream();
// will not be ordered
stream.parallel().forEach(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println(t);
}
});
stream = ints.stream();
// will be ordered
stream.parallel().forEachOrdered(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println(t);
}
});
}
}https://stackoverflow.com/questions/38262303
复制相似问题