Skip to content

Commit c207cff

Browse files
author
martipatgra
committed
added Optional
1 parent c82dab5 commit c207cff

File tree

4 files changed

+115
-2
lines changed

4 files changed

+115
-2
lines changed

docs/img/ud7/8optional.png

210 KB
Loading

docs/ud2/22for.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ public static void main(String[] args) {
122122

123123
!!! Note Nota
124124
Si creo un bucle de la siguiente forma `for(int i = 0; i < 10; i++);` ese bucle no hará nada, porque acaba en `;`.
125-
Con el `;` estamos indicando fin de statement o sentencia, es decir, fin de bucle, cualquier línea detrás del ; no será parte del bucle.
126-
125+
Con el `;` estamos indicando fin de statement o sentencia, es decir, fin de bucle, cualquier línea detrás del ; no será parte del bucle. Esto no solo se aplica para el bucle `for`, también para la sentencia `if` o `while`.
127126

128127
## Bucle infinito
129128

docs/ud7/8optional.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Optional
2+
3+
`Optional` es una clase genérica, **cuyo propósito es ser un contenedor para un valor que puede o no ser nulo**. Fue creado por los ingenieros de Java, para abordar el problema o excepción tan conocida la `NullPointerException`.
4+
5+
La documentación oficial de Java dice que este tipo está pensado principalmente para un uso como tipo de retorno de método, bajo condiciones específicas.
6+
7+
`Optional` trata de resolver el problema cuando hay ausencia de resultados o datos y no queremos que esto sea un error. Por ejemplo, no todas las personas tienen 2o apellido. Esto sería válido para un optional, pero por ejemplo todo el mundo tenemos fecha de nacimiento, esto si que es un error.
8+
9+
## Crear una instancia de `Optional`
10+
11+
`Optional` es una clase genérica que se declara como cualquier otra, indicando el tipo. Aunque, no se puede construir un `Optional`. En su lugar, se usa uno de sus métodos estáticos: `empty`, `of` or `ofNullable`.
12+
13+
![Optional](../img/ud7/8optional.png)
14+
15+
### Ejemplo con `Optional.of`
16+
17+
```java
18+
Student s = new Student("Patricia", 32, LocalDate.now());
19+
Optional<Student> op = Optional.of(s);
20+
System.out.println("Empty: " + op.isEmpty() + " Present: " + op.isPresent());
21+
```
22+
23+
Output
24+
>Optional[Patricia,32,2023-10-15]
25+
26+
>Empty: false Present: true
27+
28+
Hay que tener cuidado con Optional.of(object), ya que si lo usamos y puede llegar un valor `null`, dará una excepción `NullPointerException`:
29+
30+
```java
31+
Student s = null;
32+
Optional<Student> op = Optional.of(s);
33+
System.out.println(op);
34+
System.out.println("Empty: " + op.isEmpty() + " Present: " + op.isPresent());
35+
```
36+
37+
Output
38+
>`NullPointerException`
39+
40+
Por tanto, no habremos solucionado el problema, en vez de eso, debemos usar el método Optional.ofNullable(object), que si el objeto que se pasa es `null`, devolverá un `Optional` vacío.
41+
42+
```java
43+
Student s = null;
44+
Optional<Student> op = Optional.ofNullable(s);
45+
System.out.println(op);
46+
System.out.println("Empty: " + op.isEmpty() + " Present: " + op.isPresent());
47+
```
48+
49+
Output
50+
>Optional.empty
51+
52+
>Empty: true Present: false
53+
54+
{==
55+
56+
La primera regla para los desarrolladores que utilizan `Optional`, es que cualquier método que devuelva un `Optional`, nunca debe devolver null. En su lugar, debería devolver un optional vacío.
57+
58+
==}
59+
60+
## Cómo obtener el objeto o valor del `Optional`
61+
62+
El tipo `Optional` tiene un método `get()`, que devuelve el valor.
63+
64+
```java
65+
Student student = new Student("Patricia", 32, LocalDate.now());
66+
Optional<Student> op = Optional.ofNullable(student);
67+
System.out.println(op.get());
68+
System.out.println("Empty: " + op.isEmpty() + " Present: " + op.isPresent());
69+
```
70+
71+
Output
72+
>Patricia,32,2023-10-15
73+
74+
>Empty: false Present: true
75+
76+
En el ejemplo anterior, ha funcionado correctamente, hemos obtenido el objeto Student al hacer op.get().
77+
Veamos que pasa, cuando `Optional.ofNullable()` devuelve un optional vacío:
78+
79+
```java
80+
Student studentNull = null;
81+
Optional<Student> op = Optional.ofNullable(studentNull);
82+
System.out.println(op.get());
83+
System.out.println("Empty: " + op.isEmpty() + " Present: " + op.isPresent());
84+
```
85+
86+
Output
87+
>Exception in thread "main" java.util.NoSuchElementException: No value present
88+
89+
El código anterior nos lanza una excepción porque **sólo podemos llamar al método get() si el método isPresent es verdadero, es decir, si tengo valor**. Para corregir el error tendríamos que realizar lo siguiente:
90+
91+
```java
92+
Student studentNull = null;
93+
Optional<Student> op = Optional.ofNullable(studentNull);
94+
if (op.isPresent()) {
95+
System.out.println(op.get());
96+
}
97+
98+
// también puedes hacerlo en una sola línea de código
99+
op.ifPresent(System.out::println);
100+
```
101+
Ahora vemos que no imprime nada porque isPresent() devuelve false, ya que optional es vacío. Si queremos mostrar algo cuando tengamos un Optional vacío, podemos usar el método `ifPresentOrElse`:
102+
103+
```java
104+
Student studentNull = null;
105+
Optional<Student> op = Optional.ofNullable(studentNull);
106+
op.ifPresentOrElse(System.out::println, ()-> System.out.println("empty object"));
107+
```
108+
109+
El método ifPresentOrElse, recibe un `Consumer`, que es si el objeto no está vacío, y un `Runnable` que se llamará si está vacío.
110+
Como `Runnable` es una interfaz funcional, podemos usar lambda para implementar el método `run`, que será la acción que se realice si el objeto `Optional` es vacío.
111+
112+
Output
113+
>empty object

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ nav:
7878
- 🦄 Predicate, Supplier and Consumer: ud7/3predicates.md
7979
- 🦄 Functions: ud7/4functions.md
8080
- 🦄 Referencia a métodos: ud7/5references.md
81+
- 🦄 Optional: ud7/8optional.md
8182
- 🦄 Streams: ud7/6streams.md
8283
- 🦄 Expresiones regulares: ud7/7regularexpressions.md
8384
- 🤩 Interfaces de usuario:

0 commit comments

Comments
 (0)