2009-05-27 3 views
5

Introducendo parte della bontà delle operazioni di raccolta nel nostro codebase senza aggiungere una nuova dipendenza di libreria esterna, stiamo aggiungendo questi metodi al nostro pacchetto di utilità.Estensioni di raccolta di nomi per chiarezza

static public List<T> filter(List<T> source, Predicate<T> filter); 
static <Y,T> public List<Y> transform(List<T> source, Mutator<Y,T> filter); 
static public boolean exists(List<T> source, Predicate<T> filter); 
static public T findFirst(List<T> source, Predicate<T> filter); 
static public boolean trueForAll(List<T> source, Predicate<T> filter); 

Con le interfacce guardiano

public interface Predicate<T> { public boolean apply(T item); } 
public interface Mutator<T,Y> { public Y apply(T item); } 

Quindi, le domande:

  • sono i filtri un buon nome per la classe che contiene le estensioni? Se no, un migliore?
  • È il mutatore < T, Y> nome appropriatamente?
  • Dovrei preferire mappa-trasformare e ridurre-filtro?
  • Esistono importanti funzioni basate su set che ho dimenticato di includere nella classe della libreria?

A cura di aggiungere: Un argomento importante che ho contro mappa (e quindi a favore di trasformare) è che mappa ha una significativa del carico semantico a causa dei molti usi per java.util.Map

risposta

1

io li chiamerei mappa e filtro. Ridurre ha un significato leggermente diverso per me, e la trasformazione è troppo vaga. Per quanto riguarda il nome della classe, i filtri potrebbero non essere i migliori, ma non ho una raccomandazione migliore.

So che non stavi chiedendo per questo particolare, ma alcune delle firme dei metodi generici può essere migliorato:

static public <T> List<T> filter(List<T> source, Predicate<? super T> filter); 
static public <Y,T> List<Y> transform(List<T> source, Mutator<Y,? super T> filter); 
static public <T> boolean exists(List<T> source, Predicate<? super T> filter); 
static public <T> T findFirst(List<T> source, Predicate<? super T> filter); 
static public <T> boolean trueForAll(List<T> source, Predicate<? super T> filter); 
+0

Grazie, dato che sono abituato a pensare ai generici CLR piuttosto che ai generici JDK5, è sicuramente un buon punto. –

0

Questo non è proprio quello che hai chiesto, ma è nello spirito della tua domanda. Per me, si legge meglio dire:

List<String> shortWords = filtered(allWords, short); 

di

List<String> shortWords = filter(allWords, short); 

Vorrei restare con trasformare e filtro.

+1

avrei abbastanza in disaccordo; Penso che il verbo funzioni un po 'più chiaramente dell'aggettivo (perché descrive più accuratamente il fatto che si sta verificando qualche azione). È un piccolo disaccordo, però. –

+0

Tendo a pensare ai metodi come a azioni. il filtro sembra più appropriato del filtrato. L'importante è essere coerenti però. – ebrown

+0

Riesco a capire il tuo ragionamento, McWafflestix e ebrown, ma mi piace nominare una funzione di ritorno del valore in modo che descriva ciò che viene restituito. Ciò che viene restituito è l'elenco filtrato, non è il filtro. –

1

Questo sembra davvero bello; Penso che tu sia decisamente sulla buona strada qui. Sì, penso che Mutator sia un buon nome; trasformare è meglio perché è più comunemente letto come un verbo, e la mappa ha una connotazione "sostantivo" che potrebbe essere fonte di confusione; e l'unica funzione principale basata su set che potrei pensare che potresti volere sarebbe una funzione di riordino.

+0

dal momento che Collections.sort è disponibile, non pensavo avessimo bisogno di un ulteriore metodo di ordinamento. –

1

in una biblioteca simile che ho usato:

  • Specification al posto di Predicate: aSpecification.isSatisfiedBy(anObject);
  • Mapper al posto di Mutator
  • mappa è raccogliere fo r Smalltalkers (trasformare nel tuo caso)
  • piega è iniettare per Smalltalkers
  • filtro è selezionare per Smalltalkers
+0

piega? qual è l'operazione sottostante lì? –

+0

http://c2.com/cgi/wiki?FoldFunction – dfa

0

Sembrerebbe Transform dovrebbe essere Mutate (o, in alternativa Mutator dovrebbe essere Transformer,) per coerenza. Questo sembra abbastanza chiaro l'intento:

static <Y,T> public List<Y> mutate (List<T> originalForm, Mutator<Y,T> mutator); 

E 'anche un po' più dettagliato (ma più consistente e convenzionale) a spec:

static public boolean isTrueForAll(List<T> source, Predicate<T> filter); 

o

static public boolean assertTrueForAll(List<T> source, Predicate<T> filter); 
+0

buon punto su isTrueForAll vs. trueForAll ... (ma devo ammettere che arriva da questo "cosa manca nelle raccolte JDK1.5 che è presente nella prospettiva .Net BCL", quindi la mia aspettativa di denominazione aveva un pregiudizio preesistente. .. –

2

Are ci sono delle importanti set a base di funzioni che non mi ricordo a includere nella classe biblioteca?

Per le funzioni di raccolta di ordine superiore, utilizzo l'approccio delineato da Adrian Kuhn nel suo articolo "Pimp My Foreach".

Alcuni di questi hai già, ma pensato che li getterei fuori c'è comunque:

  • AllSatisfy
  • AnySatisfy
  • cardinalità
  • Raccogliere
  • Conte
  • CutPieces
  • Rileva
  • Fold
  • GroupedBy
  • IndexOf
  • Inject
  • Rifiuta
  • Selezionare