簡體   English   中英

作為返回類型可重復使用

[英]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是另一個接口,用於提供迭代集合的邏輯,項目列表等。

我們被迫實現兩個方法: hasNextnext

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++];
                }
            };
        }
    };
}

請注意我們如何創建一個項目數組,並使用我們的兩個方法hasNextnext來提供迭代它的方法。

每次調用next都會增加內部指針,而我們的hasNext方法只檢查指針是否到達數組的末尾。

ArrayListLinkedList等集合已經為你做了更好的工作(實現了remove方法)你可以通過使用ArrayList.iterator()獲得這個迭代器

現在你可以這樣寫:

for (ClientInterface el : yourClass.getNeighbours())
{
    System.out.println(el);
}

Iterable<T>是一個接口。 這意味着當您從方法接收它作為返回值時,您實際上會收到它的實現 所以,雖然你不知道這是什么實現的名稱是(實現的類名Iterable<T>接口),你仍然可以在其訪問它實現的方法,並采取行動。

一些內置實現包括ArrayListLinkedListHashSetPriorityQueueStack

當您需要返回接口類型時,必須返回它的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM