问答

关于java8 Stream中ordered Stream和unordered Stream的问题

作者:admin 2021-05-08 我要评论

我对于stream api中所描述的ordered stream 和 unordered stream有迷惑。 根据api的描述,两者的核心区别应该在于是否有encounter order Streams may or may not...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

我对于stream api中所描述的ordered stream 和 unordered stream有迷惑。
根据api的描述,两者的核心区别应该在于是否有encounter order

Streams may or may not have a defined encounter order. Whether or not a stream has an encounter order depends on the source and the intermediate operations. Certain stream sources (such as `List` or arrays) are intrinsically ordered, whereas others (such as `HashSet`) are not. Some intermediate operations, such as `sorted()`, may impose an encounter order on an otherwise unordered stream, and others may render an ordered stream unordered, such as BaseStream.unordered(). Further, some terminal operations may ignore encounter order, such as `forEach()`.

我的理解是:
List 和 Array生成的stream都是ordered stream,而使用 BaseStream.unordered() 方法则可以去除 encounter order 这个约束,变为 unordered stream。
HashSet 生成的stream是unordered stream,可以通过排序方法 sort() 强行给stream添加一个 encounter order的约束,变为 ordered stream。

我在此理解的基础上,对于 findFirst() 方法进行了尝试
以下是findFirst()方法的描述

Optional<[T]>?findFirst()

Returns an Optional describing the first element of this stream, 
or an empty Optional if the stream is empty. 
If the stream has no encounter order, then any element may be returned.

根据此方法描述,如果stream没有encounter order 的话,就可能会随意返回流中的一个值。

我创建了一个ArrayList,并调用了unordered()方法变成了unordered stream, 这样的话 findFirst()方法应该会随机返回ArrayList中的一个值。
但是我将下列代码循环了10000次,每次findFirst都是1。

    @Test
    void t5() {
        for (int i = 0; i < 10000; i++) {
            List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
            Optional<Integer> first = list.stream().unordered().findFirst();
            assertEquals(1, first.get(), String.format("findFirst()->%s,loop->%s", first.get(), i));
        }
    }

这段代码我执行了很多次,结果都没变。是我的测试代码有问题还是我的理解有问题,希望各位大佬能帮忙解答。

###

unordered并不会打乱顺序,只是解除限制,不再保证顺序,然后某些操作可以做一些特殊优化
是“不保证有序”,不是“保证无序“
想打乱的话,加个.parallel()

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 关于java8 Stream中ordered Stream和un

    关于java8 Stream中ordered Stream和un

  • 关于数值相等判断的疑惑

    关于数值相等判断的疑惑

  • 急急急,有大佬知道这种微信小程序分享

    急急急,有大佬知道这种微信小程序分享

  • 微信小程序页面最上面的内容被遮挡问题

    微信小程序页面最上面的内容被遮挡问题

腾讯云代理商
海外云服务器