[英]Implementing iterator design pattern
我有一個類 Example 女巫私有字段Hashmap<Integer, CustomObject>
。 我的目標是使用Iterable
接口訪問CustomObject
中的所有CustomObject
實例。 首先,我聲明 Example 來實現Iterable<CustomObject>
。 然后我調用iterator()
方法。 但是,我不知道是否應該指定hasNext()
等,在主代碼中放什么? 這是我到目前為止所擁有的:
public class Example implements Iterable<Songs>{
private HashMap <Integer, CustomObject>;
@Override
public Iterator<CustomObject> iterator() {
for (CustomObject customObject: this){
System.out.println(customObject);
}
public static void main(String[] args) {
Example.iterator();
}
實際上HashMap
有一個方法Map::values()
將值的集合作為Collection<T>
,它實際上是一個Iterable<T>
(因此可以返回一個Iterator<T>
)。
Map<Integer, CustomObject> map = new HashMap<>();
Iterator<CustomObject> iterator = map.values().iterator();
此外,您的代碼有幾個錯誤:
private HashMap <Integer, CustomObject>;
錯過了字段名稱和可能的啟動。Iterable<Songs>
你必須覆蓋public Iterator<CustomObject> iterator()
。 我假設你的意思是class Example implements Iterable<CustomObject>
。Iterable::iterator
不是靜態方法,所以不能調用Example.iterator();
. 一個完整的例子,假設Example
是HashMap map
的可迭代委托,就像在你的類中一樣(你忘記命名它,否則它不會編譯和初始化它),那么你可以這樣做:
public class Example implements Iterable<CustomObject> {
private Map<Integer, CustomObject> delegate = ...; // initialize + data
@Override
public Iterator<CustomObject> iterator() {
return this.delegate.values().iterator();
}
}
並在以下任何片段中使用 like:
Example
是一個Iterable
,那么它就可以與增強循環一起使用: for (CustomObject customObject: new Example()) { // Iterable with enhanced loop System.out.println(customObject); }
Iterator
: Iterator<CustomObject> iterator = new Example().iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
Iterable
返回其Spliterator
通過Stream
: StreamSupport.stream(new Example().spliterator(), false) .forEach(System.out::println);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.