【问题标题】:Java 8 Stream.findFirst() makes sence only after sorting? [closed]Java 8 Stream.findFirst() 仅在排序后才有意义? [关闭]
【发布时间】:2020-12-02 12:08:11
【问题描述】:

流是无序的数据串,它们的成员不能被索引访问。 这种情况下是什么意思

Stream.findFirst()

方法?未排序的流中的“第一个”元素是什么意思?只是为了找到任何元素mathicng我们确实有方法

Stream.findAny()

对于Stream.findFirst(),根据Java Doc:

返回描述此流的第一个元素的 {@link Optional},如果流为空,则返回空的 {@code Optional}。如果流没有遇到顺序,则可以返回任何元素。

一般来说,一个流没有任何顺序,除非明确排序

Stream.sort()

方法。

也就是说,Stream.findFirst() 只有在流也已排序时才有意义。

我说的对吗?请帮忙!

【问题讨论】:

  • 一个流,无论是否有序,要么是空的,要么有第一个元素。
  • “通常,流没有任何顺序”为假。文档清楚地说明了没有顺序的流会发生什么:“任何元素都可能被返回。”

标签: java java-8 java-stream


【解决方案1】:

通常,流没有任何顺序,除非通过Stream.sort() 方法明确排序。

这不是真的。来自docs

流是否有遇到顺序取决于源和中间操作。

流是否有遇到顺序取决于来源,以及您使用的中间操作。 sorted 只是制作有序流的方法之一。

文档继续说:

某些流源(例如List 或数组)本质上是有序的,而其他流源(例如HashSet)则不是。

因此您可以确定List.stream() 将始终为您提供有序流,而该流上的findFirst 将为您提供列表的第一个元素。

findFirst 在无序流上,如您所引用的,将返回任何元素。这意味着不能保证返回哪个元素。它可能是第一个,但也可能是别的东西。

【讨论】:

    【解决方案2】:

    无法保证返回哪个元素。

    【讨论】:

    • 这就是为什么我的意思是该方法确实有意义,只有在对流进行排序之后。否则你可以使用 findAny 方法——你也不能保证返回哪个元素!
    • @AlexMi 在这一点上,您似乎只是在抱怨findFirst 的命名? Stack Overflow 不适合那样做。不,findFirstfindAny 非常不同。见this。并行流和无序流是完全不同的东西。
    • @Sweeper 谢谢!当然,作为一个更有经验的人,你更了解细节。但是,方法的良好命名难道不是最好的开发人员实践之一吗?再次感谢您的热心帮助!
    【解决方案3】:

    Findfirst 总是会在任何中间过程完成后找到方法处理的第一个元素。这是一个例子。

    int[] a = {1,7,3,5,6,9,8};
    int res =  Arrays.stream(a).boxed().filter(i->i%2 == 0).findFirst().get();
    System.out.println(res);
    

    打印

    6
    

    这是第一个通过过滤器的偶数。而对于同一个数组,以下将返回 1,因为没有中间操作来改变流。

    int res =  Arrays.stream(a).boxed().findFirst().get();
    

    findFirst 相比,findAny 很可能会在顺序流中返回相同的元素。在并行操作中,findFirst 总是会找到第一个返回的,即使是在同一源的顺序操作中也是如此。 FindAny 不会,因为不同的线程会在不可预测的时间内遇到不同的值。

    【讨论】:

    • 对不起,这不能回答我的问题。在无序的一堆数据中“它遇到的第一个元素”没有合理的意义。 “第一个”意味着该元素是第一个条件,而不仅仅是“任何”。因为,对于“any”,我们确实有方法 findAny。那么我们为什么要对 findFirst 重复同样的操作呢?!!
    • findAny 和 FindFirst 的区别在并行操作中更为重要。如果以并行或顺序模式重复相同的流,FindFirst 不会改变其结果。 findAny 也不能这样说。
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 2012-06-09
    • 2015-11-04
    • 2012-12-28
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多