將Java枚舉轉換為流
- java
1.概述
Enumeration
是Java第一個版本(JDK 1.0)的接口。該接口是通用的,並提供對元素序列的延遲訪問。儘管在Java的較新版本中有更好的替代方法,但是舊版實現仍可以使用Enumeration
接口返回結果。因此,為了現代化舊版實現,開發人員可能必須將Enumeration
對象轉換為Java Stream API。
在這個簡短的教程中,我們將實現一種用於將Enumeration
對象轉換為Java Stream API的實用程序方法。結果,我們將能夠使用流方法,例如filter
和map
。
2.Java的Enumeration
接口
讓我們從一個示例開始,以說明Enumeration
對象的用法:
public static <T> void print(Enumeration<T> enumeration) {
while (enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}
}
Enumeration
有兩個主要方法: hasMoreElements
和nextElement
。我們應該同時使用這兩種方法來遍曆元素的集合。
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
對象。
我們還需要重寫tryAdvance
和forEachRemaining
方法。 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
對象。