En parcourant la documentation du package Java.util , j'ai été surpris de constater que Optional<T>
et OptionalInt
n'ont aucun rapport l'un avec l'autre. Cela semble très difficile à croire, car cela suggère qu'il s'agit de classes indépendantes.
OptionalInt
supplémentaire? Pourquoi ne pouvez-vous pas simplement utiliser Optional<Integer>
? Je pensais que c'était dû au fait que int
est primitif, mais il n'y a pas de OptionalChar
, ce serait donc un choix de conception incohérent.Java 8 a introduit un lot dédié aux primitives. La raison en est probablement que les primitives de boxe peuvent créer beaucoup de "boîtes" de déchets.
Par exemple ceci
OptionalInt optionalFirst = IntStream
.range(0, 100)
.filter(i -> i % 23 > 7)
.findFirst();
Ici, un Optional<Integer>
Comme résultat serait incohérent. Des méthodes comme ifPresent(IntConsumer consumer)
permettent ensuite de rester dans le monde IntStream
. Optional<Integer>
Vous obligerait à convertir (ce que vous pouvez faire facilement si vous le souhaitez)
Il n'y a pas besoin de support spécial pour char
ou short
ou byte
car tous peuvent être représentés comme int
. Le manquant est boolean
mais il n'y a pas grand chose à faire dans un flux avec eux car il n'y a que 2 valeurs.
Il doit y avoir une classe OptionalInt
pour que les flux Java 8 soient cohérents. Si vous regardez la classe Stream
, vous verrez que beaucoupsurlesméthodes return Optional<T>
. Cependant, face à un Stream<Integer>
, Stream<Long>
ou tout autre flux de primitives est épuisant, il existe donc une classe IntStream
et une classe LongStream
qui remplacent l'objet par sa valeur sans boîte. Par exemple, trouver la somme des éléments d'un Stream<Integer>
n'est pas trivial, alors que pour un IntStream
, vous appelez simplement IntStream#sum
Dans ces classes, le JDK remplace utilement Optional<T>
avec OptionalInt
, OptionalLong
, etc.
OptionalInt
est un conteneur contenant une valeur de type primitif int
. Les types primitifs ne peuvent pas être utilisés comme paramètres de type pour les classes génériques, donc il ne peut en aucun cas s'agir d'une sous-classe de Optional<T>
.