web-dev-qa-db-fra.com

OptionalInt vs Facultatif <Integer>

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.

  1. Pourquoi n'ont-ils pas une interface commune, une classe, des sous-types ou quelque chose pour révéler la relation qu'ils ont? (Ce sont des classes très similaires quand on regarde leurs utilisations.)
  2. Aussi, pourquoi le besoin d'une classe 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.
37
Michael

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.

30
zapl

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.

11
Justin

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>.

3
Jiri Tousek