作为返回类型可重复使用

Tol*_*mer 3 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!
}
Run Code Online (Sandbox Code Playgroud)

小智 8

看起来您的类应该具有Iterable<ClientInterface>类成员的实现,如ArrayList.

我们以此为例:

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

   public Iterable<Person> getRiders() {

     return riders;

   }
   ... //other methods
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rno 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>();
}
Run Code Online (Sandbox Code Playgroud)

好吧,好吧因为Iterable它只是我们需要实现方法或使用实现的接口.

由于这是我们应该手动完成的事情,我们应该自己实现这些方法.

唯一的方法(在Java8中,有3种方法,但我们将忽略它)是iterator()返回一个iterator.

public Iterable<ClientInterface> getNeighbours()
{
    return new Iterable<ClientInterface>()
    {
        @Override
        public Iterator<ClientInterface> iterator()
        {
            return null;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

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;
                }
            };
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我们需要记住哪个是我们的最后位置,所以我们将在迭代器中创建一个字段.

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;
                }
            };
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是:我们应该迭代什么?这取决于你,一个例子可能是:

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++];
                }
            };
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

喜欢收藏ArrayList,LinkedList等已经做的工作,为您和更好的(实现remove方法),你可以通过使用得到这个迭代器ArrayList.iterator()

现在你可以这样写:

for (ClientInterface el : yourClass.getNeighbours())
{
    System.out.println(el);
}
Run Code Online (Sandbox Code Playgroud)