| /* | |
| * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. Oracle designates this | |
| * particular file as subject to the "Classpath" exception as provided | |
| * by Oracle in the LICENSE file that accompanied this code. | |
| * | |
| * This code 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 | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| package java.util; | |
| /** | |
| * A collection that has a well-defined encounter order, that supports operations at both ends, | |
| * and that is reversible. The elements of a sequenced collection have an <a id="encounter"> | |
| * <i>encounter order</i></a>, where conceptually the elements have a linear arrangement | |
| * from the first element to the last element. Given any two elements, one element is | |
| * either before (closer to the first element) or after (closer to the last element) | |
| * the other element. | |
| * <p> | |
| * (Note that this definition does not imply anything about physical positioning | |
| * of elements, such as their locations in a computer's memory.) | |
| * <p> | |
| * Several methods inherited from the {@link Collection} interface are required to operate | |
| * on elements according to this collection's encounter order. For instance, the | |
| * {@link Collection#iterator iterator} method provides elements starting from the first element, | |
| * proceeding through successive elements, until the last element. Other methods that are | |
| * required to operate on elements in encounter order include the following: | |
| * {@link Iterable#forEach forEach}, {@link Collection#parallelStream parallelStream}, | |
| * {@link Collection#spliterator spliterator}, {@link Collection#stream stream}, | |
| * and all overloads of the {@link Collection#toArray toArray} method. | |
| * <p> | |
| * This interface provides methods to add, retrieve, and remove elements at either end | |
| * of the collection. | |
| * <p> | |
| * This interface also defines the {@link #reversed reversed} method, which provides | |
| * a reverse-ordered <a href="Collection.html#view">view</a> of this collection. | |
| * In the reverse-ordered view, the concepts of first and last are inverted, as are | |
| * the concepts of successor and predecessor. The first element of this collection is | |
| * the last element of the reverse-ordered view, and vice-versa. The successor of some | |
| * element in this collection is its predecessor in the reversed view, and vice-versa. All | |
| * methods that respect the encounter order of the collection operate as if the encounter order | |
| * is inverted. For instance, the {@link #iterator} method of the reversed view reports the | |
| * elements in order from the last element of this collection to the first. The availability of | |
| * the {@code reversed} method, and its impact on the ordering semantics of all applicable | |
| * methods, allow convenient iteration, searching, copying, and streaming of the elements of | |
| * this collection in either forward order or reverse order. | |
| * <p> | |
| * This class is a member of the | |
| * <a href="{@docRoot}/java.base/java/util/package-summary.html#CollectionsFramework"> | |
| * Java Collections Framework</a>. | |
| * | |
| * @apiNote | |
| * This interface does not impose any requirements on the {@code equals} and {@code hashCode} | |
| * methods, because requirements imposed by sub-interfaces {@link List} and {@link SequencedSet} | |
| * (which inherits requirements from {@link Set}) would be in conflict. See the specifications for | |
| * {@link Collection#equals Collection.equals} and {@link Collection#hashCode Collection.hashCode} | |
| * for further information. | |
| * | |
| * @param <E> the type of elements in this collection | |
| * @since 21 | |
| */ | |
| public interface SequencedCollection<E> extends Collection<E> { | |
| /** | |
| * Returns a reverse-ordered <a href="Collection.html#view">view</a> of this collection. | |
| * The encounter order of elements in the returned view is the inverse of the encounter | |
| * order of elements in this collection. The reverse ordering affects all order-sensitive | |
| * operations, including those on the view collections of the returned view. If the collection | |
| * implementation permits modifications to this view, the modifications "write through" to the | |
| * underlying collection. Changes to the underlying collection might or might not be visible | |
| * in this reversed view, depending upon the implementation. | |
| * | |
| * @return a reverse-ordered view of this collection | |
| */ | |
| SequencedCollection<E> reversed(); | |
| /** | |
| * Adds an element as the first element of this collection (optional operation). | |
| * After this operation completes normally, the given element will be a member of | |
| * this collection, and it will be the first element in encounter order. | |
| * | |
| * @implSpec | |
| * The implementation in this interface always throws {@code UnsupportedOperationException}. | |
| * | |
| * @param e the element to be added | |
| * @throws NullPointerException if the specified element is null and this | |
| * collection does not permit null elements | |
| * @throws UnsupportedOperationException if this collection implementation | |
| * does not support this operation | |
| */ | |
| default void addFirst(E e) { | |
| throw new UnsupportedOperationException(); | |
| } | |
| /** | |
| * Adds an element as the last element of this collection (optional operation). | |
| * After this operation completes normally, the given element will be a member of | |
| * this collection, and it will be the last element in encounter order. | |
| * | |
| * @implSpec | |
| * The implementation in this interface always throws {@code UnsupportedOperationException}. | |
| * | |
| * @param e the element to be added. | |
| * @throws NullPointerException if the specified element is null and this | |
| * collection does not permit null elements | |
| * @throws UnsupportedOperationException if this collection implementation | |
| * does not support this operation | |
| */ | |
| default void addLast(E e) { | |
| throw new UnsupportedOperationException(); | |
| } | |
| /** | |
| * Gets the first element of this collection. | |
| * | |
| * @implSpec | |
| * The implementation in this interface obtains an iterator of this collection, and | |
| * then it obtains an element by calling the iterator's {@code next} method. Any | |
| * {@code NoSuchElementException} thrown is propagated. Otherwise, it returns | |
| * the element. | |
| * | |
| * @return the retrieved element | |
| * @throws NoSuchElementException if this collection is empty | |
| */ | |
| default E getFirst() { | |
| return this.iterator().next(); | |
| } | |
| /** | |
| * Gets the last element of this collection. | |
| * | |
| * @implSpec | |
| * The implementation in this interface obtains an iterator of the reversed view | |
| * of this collection, and then it obtains an element by calling the iterator's | |
| * {@code next} method. Any {@code NoSuchElementException} thrown is propagated. | |
| * Otherwise, it returns the element. | |
| * | |
| * @return the retrieved element | |
| * @throws NoSuchElementException if this collection is empty | |
| */ | |
| default E getLast() { | |
| return this.reversed().iterator().next(); | |
| } | |
| /** | |
| * Removes and returns the first element of this collection (optional operation). | |
| * | |
| * @implSpec | |
| * The implementation in this interface obtains an iterator of this collection, and then | |
| * it obtains an element by calling the iterator's {@code next} method. Any | |
| * {@code NoSuchElementException} thrown is propagated. It then calls the iterator's | |
| * {@code remove} method. Any {@code UnsupportedOperationException} thrown is propagated. | |
| * Then, it returns the element. | |
| * | |
| * @return the removed element | |
| * @throws NoSuchElementException if this collection is empty | |
| * @throws UnsupportedOperationException if this collection implementation | |
| * does not support this operation | |
| */ | |
| default E removeFirst() { | |
| var it = this.iterator(); | |
| E e = it.next(); | |
| it.remove(); | |
| return e; | |
| } | |
| /** | |
| * Removes and returns the last element of this collection (optional operation). | |
| * | |
| * @implSpec | |
| * The implementation in this interface obtains an iterator of the reversed view of this | |
| * collection, and then it obtains an element by calling the iterator's {@code next} method. | |
| * Any {@code NoSuchElementException} thrown is propagated. It then calls the iterator's | |
| * {@code remove} method. Any {@code UnsupportedOperationException} thrown is propagated. | |
| * Then, it returns the element. | |
| * | |
| * @return the removed element | |
| * @throws NoSuchElementException if this collection is empty | |
| * @throws UnsupportedOperationException if this collection implementation | |
| * does not support this operation | |
| */ | |
| default E removeLast() { | |
| var it = this.reversed().iterator(); | |
| E e = it.next(); | |
| it.remove(); | |
| return e; | |
| } | |
| } |