Se stai usando Eclipse Collections (ex GS Collections), è possibile utilizzare il metodo partition
su tutti RichIterables
.
MutableList<Integer> integers = FastList.newListWith(-3, -2, -1, 0, 1, 2, 3);
PartitionMutableList<Integer> result = integers.partition(IntegerPredicates.isEven());
Assert.assertEquals(FastList.newListWith(-2, 0, 2), result.getSelected());
Assert.assertEquals(FastList.newListWith(-3, -1, 1, 3), result.getRejected());
La ragione per usare un tipo personalizzato, PartitionMutableList
, invece di Pair
è quello di permettere tipi restituiti covarianti per getSelected() e getRejected(). Ad esempio, il partizionamento di MutableCollection
fornisce due raccolte anziché elenchi.
MutableCollection<Integer> integers = ...;
PartitionMutableCollection<Integer> result = integers.partition(IntegerPredicates.isEven());
MutableCollection<Integer> selected = result.getSelected();
Se la vostra collezione non è un RichIterable
, è comunque possibile utilizzare l'utilità statica in Eclipse collezioni.
PartitionIterable<Integer> partitionIterable = Iterate.partition(integers, IntegerPredicates.isEven());
PartitionMutableList<Integer> partitionList = ListIterate.partition(integers, IntegerPredicates.isEven());
Nota: Sono un committer per Eclipse collezioni.
fonte
2013-04-15 16:54:47
notare che in caso di un numero limitato di note in anticipo rispetto alle chiavi speciali può essere molto più efficiente per GC solo per ripetere la raccolta una volta di più per ogni chiave di partizione saltando tutti gli elementi chiave differenti su ciascuna iterazione. – Vadzim
Un altro approccio sia GC-friendly che incapsulato utilizza flussi di wrapper di filtraggio Java 8 attorno alla raccolta originale: https://stackoverflow.com/questions/19940319/can-you-split-a-stream-into-two-streams – Vadzim