將Java枚舉轉換為流

1.概述

Enumeration是Java第一個版本(JDK 1.0)的接口。該接口是通用的,並提供對元素序列的延遲訪問。儘管在Java的較新版本中有更好的替代方法,但是舊版實現仍可以使用Enumeration接口返回結果。因此,為了現代化舊版實現,開發人員可能必須將Enumeration對象轉換為Java Stream API。

在這個簡短的教程中,我們將實現一種用於將Enumeration對象轉換為Java Stream API的實用程序方法。結果,我們將能夠使用流方法,例如filtermap

2.Java的Enumeration接口

讓我們從一個示例開始,以說明Enumeration對象的用法:

public static <T> void print(Enumeration<T> enumeration) {

 while (enumeration.hasMoreElements()) {

 System.out.println(enumeration.nextElement());

 }

 }

Enumeration有兩個主要方法: hasMoreElementsnextElement 。我們應該同時使用這兩種方法來遍曆元素的集合。

3.創建一個Spliterator

第一步,我們將為AbstractSpliterator抽像類創建一個具體的類。此類對於將Enumeration對象Spliterator接口是必需的:

public class EnumerationSpliterator<T> extends AbstractSpliterator<T> {



 private final Enumeration<T> enumeration;



 public EnumerationSpliterator(long est, int additionalCharacteristics, Enumeration<T> enumeration) {

 super(est, additionalCharacteristics);

 this.enumeration = enumeration;

 }

 }

除了創建類之外,我們還需要創建一個構造函數。我們應該將前兩個參數傳遞給super構造函數。第一個參數是Spliterator的估計大小。第二個是用於定義其他特徵。最後,我們將使用最後一個參數來接收Enumeration對象。

我們還需要重寫tryAdvanceforEachRemaining方法。 Stream API將使用它們Enumeration的元素執行操作:

@Override

 public boolean tryAdvance(Consumer<? super T> action) {

 if (enumeration.hasMoreElements()) {

 action.accept(enumeration.nextElement());

 return true;

 }

 return false;

 }



 @Override

 public void forEachRemaining(Consumer<? super T> action) {

 while (enumeration.hasMoreElements())

 action.accept(enumeration.nextElement());

 }

4.將Enumeration轉換為Stream

現在,使用EnumerationSpliterator類,我們可以使用StreamSupport API執行轉換:

public static <T> Stream<T> convert(Enumeration<T> enumeration) {

 EnumerationSpliterator<T> spliterator

 = new EnumerationSpliterator<T>(Long.MAX_VALUE, Spliterator.ORDERED, enumeration);

 Stream<T> stream = StreamSupport.stream(spliterator, false);



 return stream;

 }

在此實現中,我們需要創建EnumerationSpliterator類的實例。 Long.MAX_VALUE是估計大小的默認值。 Spliterator.ORDERED定義流將按枚舉提供的順序迭代元素。

接下來,我們應該從StreamSupport類中stream我們需要將EnumerationSpliterator實例作為第一個參數傳遞。最後一個參數是定義流是並行還是順序的。

5.Junit測試

通過測試我們的convert方法,我們可以觀察到現在我們能夠基於Enumeration Stream對象:

@Test

 public void givenEnumeration_whenConvertedToStream_thenNotNull() {

 Vector<Integer> input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));



 Stream<Integer> resultingStream = convert(input.elements());



 Assert.assertNotNull(resultingStream);

 }

六,結論

在本教程中,我們展示瞭如何將Enumeration轉換為Stream對象。