[英]Iterable as a return type
我無法理解方法。 我有方法需要填寫,但我真的不明白第一個。 Iterable如何成為返回類型以及它是如何使用的? 一個例子很棒......
@Override
public Iterable<ClientInterface> getNeighbours() {
return null;
}
@Override
public void addNeighbour(ClientInterface newNeighbour){
//TODO Implement me!
}
@Override
public void removeNeighbour(String clientID) {
//TODO Implement me!
}
看起來你的類應該有一個Iterable<ClientInterface>
作為類成員,比如ArrayList。
我們以此為例:
public class Bus {
private ArrayList<Person> riders;
... //constructors and other methods
public Iterable<Person> getRiders() {
return riders;
}
... //other methods
}
一切都可以是返回類型:枚舉,類,接口,int,異常等。
Iterable
是一個可用於在foreach調用中使用return的interface
(這就是為什么你可以使用for(T something : AnArrayList)
因為ArrayList<T>
實現了Iterable<T>
)
現在,我的回答包含一個例子:
我們有一個getNeighbours
方法,它返回Iterable<ClientInterface>
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>();
}
好吧,好吧,因為Iterable
只是我們需要實現方法或使用實現的接口。
由於這是我們應該手動完成的事情,我們應該自己實現這些方法。
唯一的方法(在Java8中,有3個方法,但我們將忽略它)是iterator()
,它返回一個iterator
。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return null;
}
};
}
Iterator
是另一個接口,用於提供迭代集合的邏輯,項目列表等。
我們被迫實現兩個方法: hasNext和next
hasNext
用於確定是否有更多項要迭代, next
用於迭代它。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
我們需要記住哪個是我們的最后位置,所以我們將在迭代器中創建一個字段。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
這里的問題是:我們應該迭代什么? 這取決於你,一個例子可能是:
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
private ClientInterface[] items = new ClientInterface[]{new ClientInterface(), new ClientInterface()};
@Override
public boolean hasNext()
{
return position != items.length;
}
@Override
public ClientInterface next()
{
if (!hasNext()) throw new NoSuchElementException();
return items[position++];
}
};
}
};
}
請注意我們如何創建一個項目數組,並使用我們的兩個方法hasNext
和next
來提供迭代它的方法。
每次調用next
都會增加內部指針,而我們的hasNext方法只檢查指針是否到達數組的末尾。
像ArrayList
, LinkedList
等集合已經為你做了更好的工作(實現了remove
方法)你可以通過使用ArrayList.iterator()
獲得這個迭代器
現在你可以這樣寫:
for (ClientInterface el : yourClass.getNeighbours())
{
System.out.println(el);
}
Iterable<T>
是一個接口。 這意味着當您從方法接收它作為返回值時,您實際上會收到它的實現 。 所以,雖然你不知道這是什么實現的名稱是(實現的類名Iterable<T>
接口),你仍然可以在其訪問它實現的方法,並采取行動。
一些內置實現包括ArrayList
, LinkedList
, HashSet
, PriorityQueue
和Stack
。
當您需要返回接口類型時,必須返回它的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.