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.
- ¿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.)
- Además, ¿por qué la necesidad de una clase
OptionalInt
adicional? ¿Por qué no puedes usar elOptional<Integer>
? Pensé que se debía al hecho de queint
es primitivo, pero no hayOptionalChar
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>
.