2011-05-30 11 views
6

Suponga que desea compilar una copia de un objeto ImmutableSet/List/ pero filtra algunas de las entradas originales. Una forma de implementar que es la siguiente:Google Collections (Guava Libraries): ImmutableSet/List/Map and Filtering

ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS)); 

donde myObject.EQUALS es un predicado para la operación Iterables.filter(). Creo que esta es una implementación bastante elegante y fácil de leer. Sin embargo, uno crea dos objetos de lista (primero a través de la llamada Iterables.filter(...), la segunda a través del ImmutableList.copyOf(...)) que es muy ineficiente.

¿Alguien sabe de una manera más eficiente de hacerlo?

supongo que lo mejor sería añadir predicados de filtro para los ImmutableSet/List/Map constructores de modo que el objeto debe ser construido sólo una vez. Pero desafortunadamente no hay tal parámetro.

+1

Quizás pueda usar Predicates.equalTo() en lugar de implementarlo :) –

+0

Gracias por la pista ;-) – danbim

Respuesta

0

Mira Iterators

Específicamente filtrar (iterador sin filtrar, predicado predicado) de guayaba

+1

Bueno, sí, eso se usa internamente por 'Iterables .filter() ':-) –

+0

Sí. Tienes razón. Solo lo miré. En caso de duda utilizo siempre uso de los iteradores, pero eso es bueno saberlo (Ver). –

16

El resultado de Iterables.filter() es sólo una vista sobre los datos en myObject: la nueva lista sólo es construido por ImmutableList.copyOf() mediante el filtrado iterador provisto por el Iterable

+6

+1: esto es poco conocido y frecuentemente pasado por alto: 'filter()' no ** no ** crea una copia (con todas las ventajas y desventajas relacionadas), es solo una vista. –

+1

Esto es lo mismo para Iterables.transform() –

+0

¡Genial! ¡Gracias por la información! – danbim