首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java流处理顺序

Java流处理顺序
EN

Stack Overflow用户
提问于 2016-07-08 16:36:20
回答 2查看 1.3K关注 0票数 6

我有以下几点:

代码语言:javascript
复制
LinkedList<Integer> ints = new LinkedList();
//fill it with some ints
Stream<Integer> stream = ints.stream();
//process the stream in some way

我的问题是,是否可以保证流的处理顺序与底层LinkedList的顺序相同?我读了documentation,但没有任何关于订购的信息。

在我的例子中,关键是要保持秩序。

EN

回答 2

Stack Overflow用户

发布于 2016-07-08 18:48:49

documentation

流可能具有定义的相遇顺序,也可能没有。流是否具有相遇顺序取决于源和中间操作。某些流源(如列表或数组)本质上是有序的,而其他流源(如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()这样的操作很小心,看起来你可以保持顺序。然而,这可能不是一个好主意。

票数 2
EN

Stack Overflow用户

发布于 2016-07-08 16:45:29

取决于您应用于流的处理...尤其是使用并行()

代码语言:javascript
复制
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);
            }

        });
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38262303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档