將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對象。