On 3/7/19 9:41 AM, Peter Levart wrote:
There is a benefit in the runtime though. The code can decide what to do with the passed-in Iterable depending on it implementing IterableOnce or not. Much like what RandomAccess interface does to List(s). The code can decide to dump the iterable into a List and iterate the List multiple times if the Iterable implements IterableOnce or do direct multiple iteration on the passed-in Iterable if it doesn't.

Expanding on this further, there could be help for multi-pass iteration in the Iterable(Once) interfaces. For example:

public interface Iterable<T> {

    Iterator<T> iterator();

    default Iterable<T> toMultipassIterable() {
        return this;
    }
}


and then:

public interface IterableOnce<T> extends Iterable<T> {

    @Override
    default Iterable<T> toMultipassIterable() {
        List<T> list = new ArrayList<>();
        for (T t : this) {
            list.add(t);
        }
        return list;
    }
}


... so any new code that needs multiple passes can do so easily.


Regards, Peter

Reply via email to