package org.infinispan.util; import java.util.AbstractCollection; import java.util.Collection; import java.util.Iterator; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; import org.infinispan.commons.util.IteratorMapper; import org.infinispan.commons.util.SpliteratorMapper; /** * A collection that maps another one to a new one of a possibly different type. Note this collection is read only * and doesn't accept write operations. * <p> * Some operations such as {@link Collection#contains(Object)} and {@link Collection#containsAll(Collection)} may be * more expensive then normal since they cannot utilize lookups into the original collection. * @author wburns * @since 9.0 */ public class CollectionMapper<E, R> extends AbstractCollection<R> { protected final Collection<E> realCollection; protected final Function<? super E, ? extends R> mapper; public CollectionMapper(Collection<E> realCollection, Function<? super E, ? extends R> mapper) { this.realCollection = realCollection; this.mapper = mapper; } @Override public int size() { return realCollection.size(); } @Override public boolean isEmpty() { return realCollection.isEmpty(); } @Override public Iterator<R> iterator() { return new IteratorMapper<E, R>(realCollection.iterator(), mapper) { @Override public void remove() { throw new UnsupportedOperationException("remove"); } }; } @Override public Spliterator<R> spliterator() { return new SpliteratorMapper<>(realCollection.spliterator(), mapper); } @Override public Stream<R> stream() { return realCollection.stream().map(mapper); } @Override public Stream<R> parallelStream() { return realCollection.parallelStream().map(mapper); } @Override public void forEach(Consumer<? super R> action) { stream().forEach(action); } // Write operations are not supported! @Override public boolean add(R e) { throw new UnsupportedOperationException(); } @Override public boolean remove(Object o) { throw new UnsupportedOperationException(); } @Override public boolean addAll(Collection<? extends R> c) { throw new UnsupportedOperationException(); } @Override public boolean removeAll(Collection<?> c) { throw new UnsupportedOperationException(); } @Override public boolean retainAll(Collection<?> c) { throw new UnsupportedOperationException(); } @Override public void clear() { throw new UnsupportedOperationException(); } }