wildcards useful parameter method bounded are java generics java-8 language-design

useful - java generics parameter



OptionalInt vs Optional<Integer> (3)

Cuando me desplazo a través de la documentación del paquete java.util , me sorprendí al encontrar que Optional<T> y OptionalInt no tienen relación entre sí. Esto parece muy difícil de creer, ya que sugiere que son clases no relacionadas.

  1. ¿Por qué no tienen una interfaz común, una clase, son subtipos o algo para revelar la relación que tienen? (Son clases muy similares cuando miras sus usos.)
  2. Además, ¿por qué la necesidad de una clase OptionalInt adicional? ¿Por qué no puedes usar el Optional<Integer> ? Pensé que se debía al hecho de que int es primitivo, pero no hay OptionalChar por lo que sería una elección de diseño inconsistente.

Es necesario que haya una clase OptionalInt para que las secuencias de Java 8 sean coherentes. Si observa la clase Stream , verá que many of the methods devuelven Optional<T> . Sin embargo, es agotador tratar con un Stream<Integer> , Stream<Long> o cualquier otro flujo de primitivas, por lo que hay una clase IntStream y una clase LongStream que reemplazan el objeto con su valor sin caja. Por ejemplo, encontrar la suma de los elementos de un Stream<Integer> no es trivial, mientras que para un IntStream , solo debes llamar a IntStream#sum

En estas clases, el JDK reemplaza útilmente Optional<T> con OptionalInt , OptionalLong , etc.


Java 8 introdujo un montón dedicado a los primitivos. La razón es más probable que los primitivos de boxeo pueden crear una gran cantidad de "cajas" de residuos.

Por ejemplo esto

OptionalInt optionalFirst = IntStream .range(0, 100) .filter(i -> i % 23 > 7) .findFirst();

Aquí, un Optional<Integer> como resultado sería inconsistente. También los métodos como ifPresent(IntConsumer consumer) permiten permanecer dentro del mundo de IntStream . Optional<Integer> te obligaría a convertir (lo que puedes hacer fácilmente si lo deseas)

No hay necesidad de soporte especial para char o short o byte porque todos ellos pueden representarse como int . El que falta es boolean pero no hay mucho que puedas hacer en una secuencia con ellos ya que solo hay 2 valores.


OptionalInt es un contenedor que contiene un valor de tipo primitivo int . Los tipos primitivos no pueden usarse como parámetros de tipo para clases genéricas, por lo que no hay forma de que sea una subclase de Optional<T> .