web-dev-qa-db-fra.com

Prédicat intégré Java 8 qui renvoie toujours la valeur true?)

Google Guava a un prédicat qui retourne toujours true . Est-ce que Java 8 a quelque chose de similaire pour son Predicate? Je sais que je pourrais utiliser (foo)->{return true;}, Mais je veux quelque chose de pré-fabriqué, analogue à Collections.emptySet().

113
Garret Wilson

Il n’existe pas de prédicats intégrés toujours vrais et toujours faux dans Java 8. La manière la plus concise de les écrire est

x -> true

et

x -> false

Comparez-les à

Predicates.alwaysTrue() // Guava

et enfin à une classe interne anonyme:

new Predicate<Object>() {
    public boolean test(Object x) {
        return true;
    }
}

La raison pour laquelle Guava possède ces prédicats intégrés est probablement qu’il existe un énorme avantage syntaxique d’un appel de méthode statique par rapport à une classe interne anonyme. Dans Java 8, la syntaxe lambda est si concise qu'il existe un syntaxe inconvénient pour écrire un appel de méthode statique.

C'est juste une comparaison syntaxique, cependant. Il y a probablement un petit avantage d'espace s'il y avait un seul prédicat global toujours vrai, comparé aux occurrences x -> true Réparties sur plusieurs classes, chacune d'elles créant sa propre instance de prédicat. Est-ce que cela vous préoccupe? Les économies réalisées ne semblaient pas convaincantes, ce qui explique probablement pourquoi elles n'ont pas été ajoutées. Mais cela pourrait être reconsidéré pour une prochaine version.

UPDATE 2015-04-24

Nous avons envisagé d'ajouter diverses fonctions statiques nommées, telles que Predicate.alwaysTrue, Runnable.noop, Etc., et nous avons décidé de ne plus en ajouter dans les futures versions de Java SE.

Certes, il y a une valeur dans quelque chose qui a un nom par rapport à un lambda écrit, mais cette valeur est assez petite. Nous nous attendons à ce que les gens apprennent à lire et à écrire x -> true Et () -> { } Et que leur utilisation devienne idiomatique. Même la valeur de Function.identity() sur x -> x Est discutable.

Il y a un avantage minime sur le plan des performances à réutiliser une fonction existante au lieu d'évaluer un lambda écrit, mais nous nous attendons à ce que l'utilisation de ce type de fonctions soit si petite qu'un tel avantage serait négligeable et ne valait certainement pas le fardeau de l'API.

Holger a également mentionné dans des commentaires la possibilité d'optimiser des fonctions composées telles que Predicate.or Et autres. Cela a également été envisagé ( JDK-8067971 ), mais a été jugé relativement fragile et sujet aux erreurs, et se produisant assez rarement pour que sa mise en œuvre ne vaille pas la peine.

Voir aussi cette entrée Lambda FAQ .

146
Stuart Marks

Sans goyave

Boolean.TRUE::booleanValue
4
boriselec