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
对象。
0 评论