web-dev-qa-db-fra.com

Le JDK fournit-il un consommateur factice?

J'ai besoin dans un bloc de code de consommer 'n' éléments d'un flux puis de terminer, essentiellement:

 public static <T> void eat(Stream<T> stream, int n) 
     // consume n items of the stream (and throw them away)
 }

Dans ma situation, je ne peux pas changer la signature pour retourner Stream<T> Et simplement return stream.skip(n); Je dois en fait jeter certains éléments du flux (pas une simple logique) - pour être prêt pour un consommateur en aval qui n'a pas besoin de savoir comment, ni même cela, cela s'est produit.

La façon la plus simple de le faire est d'utiliser limit(n), mais je dois appeler une méthode de terminaison de flux pour activer le flux, donc en gros j'ai:

public static <T> void skip(Stream<T> stream, int n) {
    stream.limit(n).forEach(t -> {});
}

Remarque: Ce code est une simplification grossière du code réel et est uniquement à des fins d'illustration. En fait, la limite ne fonctionnera pas car il y a une logique autour de quoi/comment consommer les éléments. Pensez-y comme consommer des éléments "en-tête" à partir d'un flux, puis faire consommer les éléments "corps" par un consommateur.

Cette question concerne le lambda "ne rien faire" t -> {}.

Y a-t-il un consommateur "ne rien faire" quelque part dans le JDK, comme la fonction "ne rien faire" Function.identity()?

31
Bohemian

Non, JDK ne fournit pas de consommateur factice ainsi que d'autres fonctions prédéfinies comme un exécutable factice, un prédicat toujours vrai ou un fournisseur qui renvoie toujours zéro. Ecrivez t -> {}, c'est de toute façon plus court que d'appeler n'importe quelle méthode prête possible qui fera de même.

18
Tagir Valeev