forked from kangjianwei/LearningJDK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEnumeration.java
136 lines (131 loc) · 5.38 KB
/
Enumeration.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright (c) 1994, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.util;
/**
* An object that implements the Enumeration interface generates a
* series of elements, one at a time. Successive calls to the
* {@code nextElement} method return successive elements of the
* series.
* <p>
* For example, to print all elements of a {@code Vector<E>} <i>v</i>:
* <pre>
* for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
* System.out.println(e.nextElement());</pre>
* <p>
* Methods are provided to enumerate through the elements of a
* vector, the keys of a hashtable, and the values in a hashtable.
* Enumerations are also used to specify the input streams to a
* {@code SequenceInputStream}.
*
* @author Lee Boynton
* @apiNote The functionality of this interface is duplicated by the {@link Iterator}
* interface. In addition, {@code Iterator} adds an optional remove operation,
* and has shorter method names. New implementations should consider using
* {@code Iterator} in preference to {@code Enumeration}. It is possible to
* adapt an {@code Enumeration} to an {@code Iterator} by using the
* {@link #asIterator} method.
* @see java.util.Iterator
* @see java.io.SequenceInputStream
* @see java.util.Enumeration#nextElement()
* @see java.util.Hashtable
* @see java.util.Hashtable#elements()
* @see java.util.Hashtable#keys()
* @see java.util.Vector
* @see java.util.Vector#elements()
* @since 1.0
*/
/*
* 枚举器,用来遍历元素
*
* 枚举器可以看做是一个阉割版的外部迭代器,它只能用于遍历元素,不能移除元素
* 枚举器Enumeration可以通过asIterator()方法转换为外部迭代器Iterator来使用
*
* 注:区别于外部迭代器Iterator
* 注:区别于内部迭代器Iterable
*/
public interface Enumeration<E> {
/**
* Tests if this enumeration contains more elements.
*
* @return {@code true} if and only if this enumeration object
* contains at least one more element to provide;
* {@code false} otherwise.
*/
// 是否存在未遍历元素
boolean hasMoreElements();
/**
* Returns the next element of this enumeration if this enumeration
* object has at least one more element to provide.
*
* @return the next element of this enumeration.
*
* @throws NoSuchElementException if no more elements exist.
*/
// 返回下一个元素
E nextElement();
/**
* Returns an {@link Iterator} that traverses the remaining elements
* covered by this enumeration. Traversal is undefined if any methods
* are called on this enumeration after the call to {@code asIterator}.
*
* @return an Iterator representing the remaining elements of this Enumeration
*
* @apiNote This method is intended to help adapt code that produces
* {@code Enumeration} instances to code that consumes {@code Iterator}
* instances. For example, the {@link java.util.jar.JarFile#entries
* JarFile.entries()} method returns an {@code Enumeration<JarEntry>}.
* This can be turned into an {@code Iterator}, and then the
* {@code forEachRemaining()} method can be used:
*
* <pre>{@code
* JarFile jarFile = ... ;
* jarFile.entries().asIterator().forEachRemaining(entry -> { ... });
* }</pre>
*
* (Note that there is also a {@link java.util.jar.JarFile#stream
* JarFile.stream()} method that returns a {@code Stream} of entries,
* which may be more convenient in some cases.)
* @implSpec The default implementation returns an {@code Iterator} whose
* {@link Iterator#hasNext hasNext} method calls this Enumeration's
* {@code hasMoreElements} method, whose {@link Iterator#next next}
* method calls this Enumeration's {@code nextElement} method, and
* whose {@link Iterator#remove remove} method throws
* {@code UnsupportedOperationException}.
* @since 9
*/
// Enumeration转换为Iterator
default Iterator<E> asIterator() {
return new Iterator<>() {
@Override
public boolean hasNext() {
return hasMoreElements();
}
@Override
public E next() {
return nextElement();
}
};
}
}