'通過示例和源碼深入分析Java 8 中的Stream實現原理'

Java 文章 會寫代碼的一條魚 2019-08-12
"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過Stream.generate方法可以創建一個有無限個元素的Stream(實際個數是Long.MAX_VALUE),每一個元素具體的值由我們傳入的Function生成。它的元素分割器是InfiniteSupplyingSpliterator類型的,從它的實現上我們可以直觀的看到會指定元素個數為Long.MAX_VALUE:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過Stream.generate方法可以創建一個有無限個元素的Stream(實際個數是Long.MAX_VALUE),每一個元素具體的值由我們傳入的Function生成。它的元素分割器是InfiniteSupplyingSpliterator類型的,從它的實現上我們可以直觀的看到會指定元素個數為Long.MAX_VALUE:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建有規律的無限流

使用Stream.generate的方法創建的無限流每個元素是沒有任何關聯的,通過Stream.iterate創建的流的元素之間則是有關聯的。

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過Stream.generate方法可以創建一個有無限個元素的Stream(實際個數是Long.MAX_VALUE),每一個元素具體的值由我們傳入的Function生成。它的元素分割器是InfiniteSupplyingSpliterator類型的,從它的實現上我們可以直觀的看到會指定元素個數為Long.MAX_VALUE:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建有規律的無限流

使用Stream.generate的方法創建的無限流每個元素是沒有任何關聯的,通過Stream.iterate創建的流的元素之間則是有關聯的。

通過示例和源碼深入分析Java 8 中的Stream實現原理

Stream.iterate接收兩個參數,第一個參數指定了初始值,第二個參數則指定了剩餘元素的生成器。在上面的示例中,初始值是0,後一個元素等於前一個元素加1。

我們看看這種方式的元素分割器實現方式:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過Stream.generate方法可以創建一個有無限個元素的Stream(實際個數是Long.MAX_VALUE),每一個元素具體的值由我們傳入的Function生成。它的元素分割器是InfiniteSupplyingSpliterator類型的,從它的實現上我們可以直觀的看到會指定元素個數為Long.MAX_VALUE:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建有規律的無限流

使用Stream.generate的方法創建的無限流每個元素是沒有任何關聯的,通過Stream.iterate創建的流的元素之間則是有關聯的。

通過示例和源碼深入分析Java 8 中的Stream實現原理

Stream.iterate接收兩個參數,第一個參數指定了初始值,第二個參數則指定了剩餘元素的生成器。在上面的示例中,初始值是0,後一個元素等於前一個元素加1。

我們看看這種方式的元素分割器實現方式:

通過示例和源碼深入分析Java 8 中的Stream實現原理

從這段代碼我們可以看出它實現了一個iterator,剩下的就和最開始介紹的通過集合的方式創建Stream就基本上是一樣的了。從這個iterator可以很清除的看到,它hasNext()永遠返回的是true,所以是真正意義上的無限個,next()方法會調用我們傳入的元素生成方法。

元素分割器的原理

通過前面介紹的不同的Stream創建方式,我們可以知道不同的創建方式得到的Stream,它們之間的區別就是由各自的元素分割器決定的。元素分割器實際上就是Stream和數據源的連接器,它把數據源相關的信息提供給Stream,並把Stream的操作最終作用到具體的元素上去。

接下來我們就來分析一下元素分割器的基本實現原理,首先我們看看它們共同的接口定義:

"

上一篇文章介紹了Java 8引入的新特性Stream的用法,如果只是會用,那是經不住面試官問的,必須要在會用的基礎上能夠深入的分析它的實現原理,今天我們接著來分析一下Stream的實現原理。這篇文章先只分析創建Stream的實現原理,剩下的內容將會在接下來的文章進行分析。

通過集合創建Stream

這種方式我們在上一篇文章介紹Stream如何使用的時候就已經演示過了,它也是我們最為常用的一種方式。

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

接下來我們看看它的創建過程,點擊進入list.stream方法看看它的實現,發現它實際使用的是Collection.stream方法,所以所有繼承自Collect的集合類都可以使用這種方式創建Stream。下面是它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

之前的文章我們說過,不同的Stream創建方式調用的都是StreamSupport.stream方法。它們之間的區別就是由StreamSupport.stream方法的第一個參數決定的。該方法的第一個參數需要傳入一個元素分割器,第二個參數則指定了是否需要並行。

對於通過集合創建的Stream而言,它的元素分割器使用的是IteratorSpliterator類,看名字就知道它是從iterator中獲取元素的,我們看看IteratorSpliterator類的主要實現代碼。

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過數組創建Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

這種方式也是通過StreamSupport.stream來創建的,它的元素分割器的類型是ArraySpliterator類。在這個元素分割器中,是通過遍歷數組的方式來獲取每一個元素的,如下面的代碼所示:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建一個空的Stream

演示代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

空流使用的元素分割器是EmptySpliterator,這個分割器什麼都不幹,所以Stream也是空的。它的實現代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建無限元素個數的Stream

示例代碼:

通過示例和源碼深入分析Java 8 中的Stream實現原理

通過Stream.generate方法可以創建一個有無限個元素的Stream(實際個數是Long.MAX_VALUE),每一個元素具體的值由我們傳入的Function生成。它的元素分割器是InfiniteSupplyingSpliterator類型的,從它的實現上我們可以直觀的看到會指定元素個數為Long.MAX_VALUE:

通過示例和源碼深入分析Java 8 中的Stream實現原理

創建有規律的無限流

使用Stream.generate的方法創建的無限流每個元素是沒有任何關聯的,通過Stream.iterate創建的流的元素之間則是有關聯的。

通過示例和源碼深入分析Java 8 中的Stream實現原理

Stream.iterate接收兩個參數,第一個參數指定了初始值,第二個參數則指定了剩餘元素的生成器。在上面的示例中,初始值是0,後一個元素等於前一個元素加1。

我們看看這種方式的元素分割器實現方式:

通過示例和源碼深入分析Java 8 中的Stream實現原理

從這段代碼我們可以看出它實現了一個iterator,剩下的就和最開始介紹的通過集合的方式創建Stream就基本上是一樣的了。從這個iterator可以很清除的看到,它hasNext()永遠返回的是true,所以是真正意義上的無限個,next()方法會調用我們傳入的元素生成方法。

元素分割器的原理

通過前面介紹的不同的Stream創建方式,我們可以知道不同的創建方式得到的Stream,它們之間的區別就是由各自的元素分割器決定的。元素分割器實際上就是Stream和數據源的連接器,它把數據源相關的信息提供給Stream,並把Stream的操作最終作用到具體的元素上去。

接下來我們就來分析一下元素分割器的基本實現原理,首先我們看看它們共同的接口定義:

通過示例和源碼深入分析Java 8 中的Stream實現原理

至此Stream的創建實現原理基本就已經講的差不多了。

"

相關推薦

推薦中...