package com.fastbee.base.util; import java.io.Serializable; import java.util.*; import java.util.function.Consumer; import java.util.function.UnaryOperator; /** * @author bill */ public class VirtualList extends AbstractList implements RandomAccess, Serializable { private final E[] elementData; private final int size; public VirtualList(E[] array, int length) { this.elementData = array; this.size = length; } @Override public int size() { return size; } @Override public Object[] toArray() { return elementData.clone(); } @Override @SuppressWarnings("unchecked") public T[] toArray(T[] a) { if (a.length < size) return Arrays.copyOf(this.elementData, size, (Class) a.getClass()); System.arraycopy(this.elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } @Override public E get(int index) { return elementData[index]; } @Override public E set(int index, E element) { E oldValue = elementData[index]; elementData[index] = element; return oldValue; } @Override public int indexOf(Object o) { E[] a = this.elementData; if (o == null) { for (int i = 0; i < size; i++) if (a[i] == null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(a[i])) return i; } return -1; } @Override public boolean contains(Object o) { return indexOf(o) != -1; } @Override public Spliterator spliterator() { return Spliterators.spliterator(elementData, 0, size, Spliterator.ORDERED); } @Override public void forEach(Consumer action) { Objects.requireNonNull(action); for (int i = 0; i < size; i++) { action.accept(elementData[i]); } } @Override public void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); E[] a = this.elementData; for (int i = 0; i < size; i++) { a[i] = operator.apply(a[i]); } } @Override public void sort(Comparator c) { Arrays.sort(elementData, 0, size, c); } }