当前位置: 首页 > 知识库问答 >
问题:

当在同一流管道中使用的终端操作不符合顺序时,中间操作是否符合顺序?

丁韬
2023-03-14

如果我在一个流流水线中使用一个map操作,并且在列表(作为源)上使用forEach()终端操作(不管它是顺序流还是并行流,它都不遵守遇到顺序),那么在顺序流还是并行流的情况下,map会尊重列表的遇到顺序吗?

List<Integer> = Arrays.asList(1,2,3,4,5)
someList.stream().map(i -> i*2).forEach(System.out::println) // this is sequential stream
someList.parallelStream().map(i -> i*2).forEach(System.out::println) // this is parallel stream

如果是,那么在本文https://stackoverflow.com/a/47337690/5527839中提到了将并行执行映射操作。如果保持顺序,它将如何使性能更好时,使用并行流。使用并行流有什么意义?

共有1个答案

夏侯弘光
2023-03-14

如果保持顺序,它将如何使性能更好时,使用并行流。使用并行流有什么意义?(是的,您仍然会获得性能,但不是预期的水平)

即使在ParallelStream时使用foreachOrdered(),中间操作map也将由并发线程执行,但在终端操作oreachOrdered中,它们将按顺序处理。尝试下面的代码,您将看到map操作中的并行性

List<Integer> someList = Arrays.asList(1,2,3,4,5);
            someList.stream().map(i -> {
                System.out.println(Thread.currentThread().getName()+" Normal Stream : "+i);
                return i*2;
            }).forEach(System.out::println); // this is sequential stream

            System.out.println("this is parallel stream");

            someList.parallelStream().map(i -> {
                System.out.println(Thread.currentThread().getName()+" Parallel Stream : "+i);
                return i*2;
            }).forEachOrdered(System.out::println); // this is parallel stream

地图荣誉会遭遇秩序吗?订购方式是否与中间操作有关?

 类似资料:
  • reverse 返回一个与指定list相反顺序的list。 val unsortedList = listOf(3, 2, 7, 5) assertEquals(listOf(5, 7, 2, 3), unsortedList.reverse()) sort 返回一个自然排序后的list。 assertEquals(listOf(2, 3, 5, 7), unsortedList.sort())

  • 有一些操作符允许你组合两个及以上的 source,它们的行为有所不同,重要的是要知道它们之间的区别。 combineLatest 函数签名如下: Rx.Observable.combineLatest([ source_1, ... source_n]) let source1 = Rx.Observable.interval(100) .map( val => "source1 " + val

  • 这可不是一个简单的话题。其中涉及了应用程序中的诸多领域,你可能想要同步 API 的响应,或者你想要处理其它类型的流,比如 UI 中的点击事件或键盘事件。 有大量的操作符以它们各自的方式来处理时间,比如 delay、 debounce、 throttle、 interval, 等等。 interval 这个操作符用来创建一个 Observable,基本上它所做的就是按固定的时间间隔提供值,函数签名如

  • 2.8 操作顺序 当表达式中出现了多个运算符的时候,计算顺序取决于优先级规则。一个完整的优先级说明是十分复杂的,出于让您尽快入门的目的,先列出以下几点: 乘除法运算优先于加减法运算。因此2*3-1得到5,而不是4。2/3-1得到-1,而不是1(记住在整型除法中2/3结果是0)。 如果运算符有相同的优先级,它们会按照从左往右的顺序计算。因此表达式minute*100/60中,乘法运算最先进行,得到5

  • 按字母顺序排列的全部操作符列表 aggregate( ) — see reduce( ) all( ) — determine whether all items emitted by an Observable meet some criteria amb( ) — given two or more source Observables, emits all of the items from