56 votes

Java 8 - en omettant fastidieux recueillir méthode

Java 8 flux api est caractéristique très intéressante et j'ai vraiment comme ça. Une chose que d'obtenir sur mes nerfs, c'est que 90% du temps, je veux avoir l'entrée comme une collection et de sortie comme des collections. La conséquence est que je dois appeler stream() et collect() méthode de tous les temps:

collection.stream().filter(p->p.isCorrect()).collect(Collectors.toList());

Est-il une api java permettez-moi de sauter le ruisseau et la possibilité d'agir directement sur les collections (comme linq en c#?):

collection.filter(p->p.isCorrect)

43voto

manouti Points 10398

Oui, à l'aide de Collection#removeIf(Predicate):

Supprime tous les éléments de cette collection qui satisfont le prédicat.

Note qu'un changement à la collection donnée, ne reviendra pas une nouvelle. Mais vous pouvez créer une copie de la collecte et de le modifier. Notez également que le prédicat doit être écartée pour agir comme un filtre:

public static <E> Collection<E> getFilteredCollection(Collection<E> unfiltered,
                                                      Predicate<? super E> filter) {
    List<E> copyList = new ArrayList<>(unfiltered);

    // removeIf takes the negation of filter 
    copyList.removeIf(e -> { return !filter.test(e);});  

    return copyList;
}

Mais comme @Holger suggère dans les commentaires, si vous choisissez de définir cette méthode utilitaire dans votre code et l'utiliser partout où vous avez besoin pour obtenir une collection filtrée, puis il suffit de déléguer l'appel à l' collect méthode dans cet utilitaire. Votre appelant code sera plus concis.

public static <E> Collection<E> getFilteredCollection(Collection<E> unfiltered,
                                                      Predicate<? super E> filter) {
   return unfiltered.stream()
                    .filter(filter)
                    .collect(Collectors.toList());
}

17voto

GuiSim Points 661

Vous aimeriez l'aide de StreamEx

StreamEx.of(collection).filter(PClass::isCorrect).toList();

Cela a l'avantage d'être légèrement plus courtes tout en gardant l'immuabilité.

10voto

Jakub Dziworski Points 239

Si vous souhaitez utiliser les collections de Goyave est FluentIterable est un chemin à parcourir!

Exemple (get id des 10 premiers clients vip):

FluentIterable
       .from(customers)
       .filter(customer -> customer.isVIP())
       .transform(Client::getId)
       .limit(10);

7voto

shmosel Points 4840

Si vous avez besoin d'une vue filtrée sans modifier l'original de la collection, pensez à la Goyave de l' Collections2.filter().

7voto

TheNorthWes Points 2228

Les ruisseaux avaient un sens bien défini l'architecture d'aller dans, lequel vous pouvez lire beaucoup de choses sur. Vous voudrez peut-être lire à ce sujet avant que vous commencez en bas de cette route.

Mais pourquoi ne pas mettre en œuvre une collection, qui met en œuvre une semblable interface de flux qui s'achève ce code pour vous?

public class StreamableCollection implements Collection, Stream {
...
}

Ensuite, vous pourriez faire quelques délicat hypothèses pour votre cas d'utilisation. Vous pouvez toujours ouvrir un flux à partir des collections de l'interface, mais vous pouvez aussi sauter à droite et puis à l'intérieur de la poignée de l'ouverture du flux, je suppose.

    streamableCollection cs = new streamableCollection();
    cs.filter();
    cs.stream();

Votre IDE hop vous avez droit à la mise en œuvre de tout... il suffit de passer le tout à la implémentations par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X