/** * Factory method to create a transforming navigable set. * <p> * If there are any elements already in the set being decorated, they * are NOT transformed. * Contrast this with {@link #transformedNavigableSet(NavigableSet, Transformer)}. * * @param <E> the element type * @param set the set to decorate, must not be null * @param transformer the transformer to use for conversion, must not be null * @return a new transformed {@link NavigableSet} * @throws NullPointerException if set or transformer is null */ public static <E> TransformedNavigableSet<E> transformingNavigableSet(final NavigableSet<E> set, final Transformer<? super E, ? extends E> transformer) { return new TransformedNavigableSet<>(set, transformer); }
@Override public NavigableSet<E> tailSet(final E fromElement, final boolean inclusive) { final NavigableSet<E> tail = decorated().tailSet(fromElement, inclusive); return transformingNavigableSet(tail, transformer); }
@Override public Iterator<E> descendingIterator() { return decorated().descendingIterator(); }
/** * Factory method to create a transforming navigable set that will transform * existing contents of the specified navigable set. * <p> * If there are any elements already in the set being decorated, they * will be transformed by this method. * Contrast this with {@link #transformingNavigableSet(NavigableSet, Transformer)}. * * @param <E> the element type * @param set the set to decorate, must not be null * @param transformer the transformer to use for conversion, must not be null * @return a new transformed {@link NavigableSet} * @throws NullPointerException if set or transformer is null */ public static <E> TransformedNavigableSet<E> transformedNavigableSet(final NavigableSet<E> set, final Transformer<? super E, ? extends E> transformer) { final TransformedNavigableSet<E> decorated = new TransformedNavigableSet<>(set, transformer); if (set.size() > 0) { @SuppressWarnings("unchecked") // set is type E final E[] values = (E[]) set.toArray(); // NOPMD - false positive for generics set.clear(); for (final E value : values) { decorated.decorated().add(transformer.transform(value)); } } return decorated; }
/** * Returns a transformed navigable set backed by the given navigable set. * <p> * Each object is passed through the transformer as it is added to the * Set. It is important not to use the original set after invoking this * method, as it is a backdoor for adding untransformed objects. * <p> * Existing entries in the specified set will not be transformed. * If you want that behaviour, see {@link TransformedNavigableSet#transformedNavigableSet}. * * @param <E> the element type * @param set the navigable set to transform, must not be null * @param transformer the transformer for the set, must not be null * @return a transformed set backed by the given set * @throws NullPointerException if the set or transformer is null * @since 4.1 */ public static <E> SortedSet<E> transformedNavigableSet(final NavigableSet<E> set, final Transformer<? super E, ? extends E> transformer) { return TransformedNavigableSet.transformingNavigableSet(set, transformer); }
@Override public E pollFirst() { return decorated().pollFirst(); }
@Override public NavigableSet<E> subSet(final E fromElement, final boolean fromInclusive, final E toElement, final boolean toInclusive) { final NavigableSet<E> sub = decorated().subSet(fromElement, fromInclusive, toElement, toInclusive); return transformingNavigableSet(sub, transformer); }
@Override public E pollLast() { return decorated().pollLast(); }
@Override public NavigableSet<E> headSet(final E toElement, final boolean inclusive) { final NavigableSet<E> head = decorated().headSet(toElement, inclusive); return transformingNavigableSet(head, transformer); }
@Override public E floor(final E e) { return decorated().floor(e); }
@Override public NavigableSet<E> descendingSet() { return transformingNavigableSet(decorated().descendingSet(), transformer); }
@Override public E ceiling(final E e) { return decorated().ceiling(e); }
@Override public E lower(final E e) { return decorated().lower(e); }
@Override public E higher(final E e) { return decorated().higher(e); }