集册 Java实例教程 将Iterator公开为Iterable。

将Iterator公开为Iterable。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

553
将迭代器公开为Iterable。

/**

 * Copyright (c) 2002-2013 "Neo Technology,"

 * Network Engine for Objects in Lund AB [http://neotechnology.com]

 *

 * This file is part of Neo4j.

 *

 * Neo4j is free software: you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation, either version 3 of the License, or

 * (at your option) any later version.

 *

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 * GNU General Public License for more details.

 *

 * You should have received a copy of the GNU General Public License

 * along with this program.  If not, see <http://www.gnu.org/licenses/>.

 */

import java.io.File;

import java.io.IOException;

import java.util.ArrayDeque;
/*
 from nowjava.com - 时代Java 
*/

import java.util.ArrayList;

import java.util.Collection;

import java.util.Deque;

import java.util.Iterator;

import java.util.List;

import java.util.NoSuchElementException;


public class Main{

    /**

     * Exposes {@code iterator} as an {@link Iterable}. It breaks the contract

     * of {@link Iterable} in that it returns the supplied iterator instance for

     * each call to {@code iterator()} on the returned {@link Iterable}

     * instance. This method mostly exists to make it easy to use an

     * {@link Iterator} in a for-loop.

     * 

     * @param <T> the type of items in the iterator.

     * @param iterator the iterator to expose as an {@link Iterable}.

     * @return the supplied iterator posing as an {@link Iterable}.

     */

    public static <T> Iterable<T> asIterable(final Iterator<T> iterator) {

        return new Iterable<T>() {

            public Iterator<T> iterator() {

                return iterator;

            }

        };/*from 时 代 J a v a*/

    }

    /**

     * Creates an {@link Iterable} for iterating over the lines of a text file.

     * @param file the file to get the lines for.

     * @return an {@link Iterable} for iterating over the lines of a text file.

     */

    public static ClosableIterable<String> asIterable(final File file) {

        return new ClosableIterable<String>() {

            private ClosableIterator<String> mostRecentIterator;


            @Override

            public Iterator<String> iterator() {

                try {

                    if (mostRecentIterator != null)

                        mostRecentIterator.close();

                    mostRecentIterator = asIterator(file);

                    return mostRecentIterator;

                } catch (IOException e) {

                    throw new RuntimeException(e);

                }

            }


            @Override

            public void close() {

                if (mostRecentIterator != null)

                    mostRecentIterator.close();
展开阅读全文