作为返回类型可重复使用

时间:2014-04-18 21:20:43

标签: java iterable

我无法理解方法。我有方法需要填写,但我真的不明白第一个。 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!
}

3 个答案:

答案 0 :(得分:7)

看起来你的类应该有Iterable<ClientInterface>的实现作为类成员,比如ArrayList。

我们以此为例:

public class Bus {
   private ArrayList<Person> riders;
   ... //constructors and other methods

   public Iterable<Person> getRiders() {

     return riders;

   }
   ... //other methods
}

答案 1 :(得分:6)

一切都可以是返回类型:枚举,类,接口,int,异常等。

Iterable是一个interface,可以用来在foreach调用中使用return(这就是为什么你可以使用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++];
                }
            };
        }
    };
}

请注意我们如何创建一个项目数组,并使用我们的两个方法hasNextnext来提供迭代它的方法。

next的每次调用都会增加内部指针,而我们的hasNext方法只会检查指针是否到达数组的末尾。

ArrayListLinkedList这样的集合已经为你做了更好的工作(实现remove方法)你可以使用ArrayList.iterator()

现在你可以这样写:

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

答案 2 :(得分:2)

Iterable<T>是一个界面。这意味着当您从方法接收它作为返回值时,您实际上会收到它的实现。因此,虽然您不知道该实现的名称是什么(实现Iterable<T>接口的类的名称),但您仍然可以访问它实现的方法并采取行动。

一些内置实现包括ArrayListLinkedListHashSetPriorityQueueStack

当您需要返回接口类型时,必须返回它的实现。