拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 将Java枚举转换为流

将Java枚举转换为流

白鹭 - 2021-11-24 353 0 0

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对象。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *