java - spanish - guava maven
¿Hay una Guava equivalente a Apache Commons CircularFifoBuffer? (4)
No veo nada parecido en Guava, pero ¿qué tal un ForwardingQueue
construido en torno a un ArrayDeque
donde se verifica la capacidad en add()
, offer()
, etc. y remove()
entradas antiguas si ya está lleno?
Necesito una estructura de datos que pueda almacenar eficientemente una cantidad específica de elementos, en orden FIFO.
Como se menciona en esta pregunta , Apache Commons tiene un CircularFifoBuffer, pero lamentablemente no está genérico. Algunas horquillas existen, pero no estoy seguro de su estado de mantenimiento.
Como Guava es la biblioteca de referencia para mis necesidades de recolección, me pregunto: ¿hay una buena alternativa en Guava? Si no, ¿debería implementarlo en mi proyecto, basado en Apache Commons ''CircularFifoBuffer?
ArrayBlockingQueue
de Java ofrece un búfer circular de tamaño fijo.
Commons-Collections with Generics ( enlace de maven ) es el camino a seguir si quiere utilizar Apache Collections con genéricos (y contiene una clase CircularFifoBuffer<E>
activa).
Por otro lado, como dice @FrankPavageau, puede usar su propia implementación de ForwardingQueue
. Un enfoque ingenuo (con lugar para futuras optimizaciones) sería algo como esto:
static class BoundedQueue<E> extends ForwardingQueue<E> {
private final Queue<E> delegate;
private final int capacity;
public BoundedQueue(final int capacity) {
this.delegate =
new ArrayDeque<E>(capacity); // specifying initial capacity is optional
this.capacity = capacity;
}
@Override
protected Queue<E> delegate() {
return delegate;
}
@Override
public boolean add(final E element) {
if (size() >= capacity) {
delegate.poll();
}
return delegate.add(element);
}
@Override
public boolean addAll(final Collection<? extends E> collection) {
return standardAddAll(collection);
}
@Override
public boolean offer(final E o) {
return standardOffer(o);
}
}
Uso:
final BoundedQueue<Integer> boundedQueue = new BoundedQueue<Integer>(3);
boundedQueue.add(1);
System.out.println(boundedQueue); // [1]
boundedQueue.add(2);
System.out.println(boundedQueue); // [1, 2]
boundedQueue.add(3);
System.out.println(boundedQueue); // [1, 2, 3]
boundedQueue.add(4);
System.out.println(boundedQueue); // [2, 3, 4]
boundedQueue.addAll(Arrays.asList(5, 6, 7, 8));
System.out.println(boundedQueue); // [6, 7, 8]
((Queue<Integer>) boundedQueue).offer(9);
System.out.println(boundedQueue); // [7, 8, 9]
Iniciando Guava 15.0 - puedes usar EvictingQueue