Java 8 Stream排序如何在后台工作?


10

当我打电话时,Stream.sort(..)是否创建了一个新的元素数组,并且流在新创建的排序数组上进行迭代?

换句话说,Java 8 Stream是如何实现sort的?


为什么我要对这个问题投反对票????
通知2016年

2
您的问题是合理的,不值得批评。但是,您对amon的回答有何评论?
安德列斯·F

@AndresF。甚至在我发表评论之前就已经投了反对票。这是我很沮丧的原因之一。
通知

无论如何,这些评论没有理由不赞成。这个问题有其自身的优点,我认为这是正确的。我赞成。
安德列斯·F

Answers:


10

您可以使用grepcode.com来搜索Java标准库代码(和其他一些库)。不幸的是,流实现代码相当抽象。一个很好的起点是内部java.util.stream.SortedOps该类将流转换为排序的流。

当前的实现(用于标准库容器的流)使得如果流已排序的无操作,使用数组,如果流的大小是已知的(SizedRefSortingSink),或累积的所有元素在一个ArrayList如果尺寸未知(RefSortingSink)。

当然,此类实现细节可能随任何发行版而变化,但是基本考虑因素是普遍的:对流进行排序必然是一个急切/阻塞的操作,而对无限流进行排序则没有意义。这意味着如果您使用流,则对流进行排序没有用,因为它们可能是惰性的,但是您仍然可以获得方便的流语法。

其他流将不得不提供自己的实现Stream.sorted(),这可能很相似。


1
@InformedA我不想建议lambda或stream是“引擎盖下的胡说八道”。尽管与其他Java概念相比,有关流的细节异常复杂,但它们都非常方便。如果您要坚持这些工具无用或有害的先入之见,那么就不必要限制自己。
阿蒙(Amon)

1
@amon-同意,加上流提供了在幕后滚动多核并行实现的可能性,而无需实际更改应用程序。流实现的复杂性正是源于此。不仅仅是方便,这是正确的抽象。对于OP-我建议您阅读Mastering Lambdas(精通Lambda)...,如果您想了解为什么Lambda和Streams如此之多而不仅仅是方便的功能。
Yuri Steinschreiber

3
@InformedA:lambda已经存在了80年,并且几乎存在于当前的每种主流编程语言中。流已经存在了40年,几乎每个主流收藏框架中都存在流。它们可能被称为不同的事物(迭代器,惰性列表,枚举器,可枚举的对象),但是它们在那里。Lambda和惰性列表是其中一些最古老,最稳定的抽象,它们在每种新的流行,炒作,范式,运动,方法论,技术,语言,操作系统,框架和库中都幸免于难。这使他们值得一看。
约尔格W¯¯米塔格

2
@InformedJava是一种编程语言,只是在JVM上运行的字节码的胡扯抽象。JVM本身只是用C(或C ++,我忘了)编写的废话抽象。C和C ++只是对汇编语言的胡扯抽象。甚至汇编语言本身也是对微码的胡扯抽象,也是对电路的胡扯抽象(好吧,我可能会在两者之间缺少一些步骤)。您可以说软件中有用的所有内容都是对其他内容的“废话抽象”。
安德烈斯·F

3
@InformedA我的忠实建议是您尝试学习一种比Java更面向功能编程的语言。即使您从未在日常工作中使用它,您也将对编程语言及其设计选择有所了解,这将有助于您使用Java :)
Andres F.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.