Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Manipulação de Valores com a Classe Optional | Operações Terminais na Stream API
Stream API

bookManipulação de Valores com a Classe Optional

Em Java, variáveis que armazenam objetos podem conter o valor null. Isso frequentemente resulta em NullPointerException se o null não for tratado corretamente. Esses erros tornam o código menos confiável e mais difícil de manter. É nesse contexto que o Optional se destaca.

Pense nele como uma caixa—ela pode conter um valor ou pode estar vazia. Em vez de usar instruções if para verificar o null, trabalha-se com essa "caixa" e utiliza-se métodos convenientes para recuperar o valor de forma segura, caso ele exista.

Sintaxe e Uso do Optional

O principal objetivo do Optional é evitar o NullPointerException substituindo verificações padrão como if (value != null) por métodos mais legíveis.

Existem três formas de criar um Optional:

  • Optional.empty() – cria um Optional vazio, sem valor;
  • Optional.of(value) – encapsula o objeto fornecido, mas apenas se for garantido que ele não é null;
  • Optional.ofNullable(value) – encapsula o objeto, mesmo que seja null, criando um Optional preenchido ou vazio.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Se você passar null para Optional.of(value), o programa irá lançar um NullPointerException, portanto ofNullable() deve ser sempre utilizado para valores potencialmente vazios.

Recuperando valores de Optional

Para extrair um valor de um Optional, pode-se utilizar o método get().

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Aqui, get() retorna o objeto real armazenado dentro do Optional. No entanto, se o Optional estiver vazio (contiver null), ao chamar get() será lançada uma NoSuchElementException.

Verificação de valor

Ao trabalhar com Optional, é necessário verificar se ele contém um valor. Uma forma de fazer isso é utilizando isPresent(), que retorna true se um valor estiver presente. No entanto, ifPresent() é frequentemente preferido, pois executa uma expressão lambda fornecida somente se o valor existir.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

No primeiro exemplo, realiza-se uma verificação manual da presença de valor utilizando isPresent() antes de chamar get(). O segundo exemplo elimina a necessidade de uma instrução if ao utilizar uma expressão lambda que é executada apenas se o produto estiver presente.

Fornecendo um Valor Padrão

Em algumas situações, quando um valor está ausente, retornar uma alternativa é recomendável. Isso pode ser feito com orElse(), que fornece um valor de fallback. Se a geração do valor de fallback exigir cálculo, orElseGet() é mais eficiente, pois executa a função apenas quando necessário.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

A diferença é que orElse() sempre cria o valor alternativo, mesmo que não seja necessário, enquanto orElseGet() chama a função fornecida apenas se o Optional estiver vazio.

Lançando uma Exceção se o Valor Estiver Ausente

Em alguns casos, a ausência de um valor é um erro. Nessas situações, orElseThrow() pode ser utilizado para lançar uma exceção.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Aqui, se o Optional estiver vazio, o programa lança uma RuntimeException. Isso é útil quando um valor ausente representa um erro crítico.

Transformando Valores

Frequentemente, um Optional contém objetos complexos, mas pode ser necessário trabalhar apenas com campos específicos. Nesses casos, utiliza-se o map(), que aplica uma determinada função se um valor estiver presente.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Se o Optional estiver vazio, map() simplesmente retorna Optional.empty(). Caso contrário, aplica String::length e retorna um Optional<Integer>.

Filtrando valores

Em algumas situações, é necessário manter um valor apenas se ele atender a uma determinada condição. O método filter() auxilia ao reter o valor se o predicado fornecido retornar true ou ao retornar Optional.empty() caso a condição não seja atendida.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Se o comprimento da string for maior que 5, o valor é mantido; caso contrário, o Optional se torna vazio.

1. O que acontece se você chamar get() em um Optional vazio?

2. O que este código irá imprimir?

3. Qual será o resultado do código a seguir?

4. Qual método é mais adequado para fornecer um valor padrão que só é calculado quando necessário?

question mark

O que acontece se você chamar get() em um Optional vazio?

Select the correct answer

question mark

O que este código irá imprimir?

Select the correct answer

question mark

Qual será o resultado do código a seguir?

Select the correct answer

question mark

Qual método é mais adequado para fornecer um valor padrão que só é calculado quando necessário?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 2.33

bookManipulação de Valores com a Classe Optional

Deslize para mostrar o menu

Em Java, variáveis que armazenam objetos podem conter o valor null. Isso frequentemente resulta em NullPointerException se o null não for tratado corretamente. Esses erros tornam o código menos confiável e mais difícil de manter. É nesse contexto que o Optional se destaca.

Pense nele como uma caixa—ela pode conter um valor ou pode estar vazia. Em vez de usar instruções if para verificar o null, trabalha-se com essa "caixa" e utiliza-se métodos convenientes para recuperar o valor de forma segura, caso ele exista.

Sintaxe e Uso do Optional

O principal objetivo do Optional é evitar o NullPointerException substituindo verificações padrão como if (value != null) por métodos mais legíveis.

Existem três formas de criar um Optional:

  • Optional.empty() – cria um Optional vazio, sem valor;
  • Optional.of(value) – encapsula o objeto fornecido, mas apenas se for garantido que ele não é null;
  • Optional.ofNullable(value) – encapsula o objeto, mesmo que seja null, criando um Optional preenchido ou vazio.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Se você passar null para Optional.of(value), o programa irá lançar um NullPointerException, portanto ofNullable() deve ser sempre utilizado para valores potencialmente vazios.

Recuperando valores de Optional

Para extrair um valor de um Optional, pode-se utilizar o método get().

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Aqui, get() retorna o objeto real armazenado dentro do Optional. No entanto, se o Optional estiver vazio (contiver null), ao chamar get() será lançada uma NoSuchElementException.

Verificação de valor

Ao trabalhar com Optional, é necessário verificar se ele contém um valor. Uma forma de fazer isso é utilizando isPresent(), que retorna true se um valor estiver presente. No entanto, ifPresent() é frequentemente preferido, pois executa uma expressão lambda fornecida somente se o valor existir.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

No primeiro exemplo, realiza-se uma verificação manual da presença de valor utilizando isPresent() antes de chamar get(). O segundo exemplo elimina a necessidade de uma instrução if ao utilizar uma expressão lambda que é executada apenas se o produto estiver presente.

Fornecendo um Valor Padrão

Em algumas situações, quando um valor está ausente, retornar uma alternativa é recomendável. Isso pode ser feito com orElse(), que fornece um valor de fallback. Se a geração do valor de fallback exigir cálculo, orElseGet() é mais eficiente, pois executa a função apenas quando necessário.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

A diferença é que orElse() sempre cria o valor alternativo, mesmo que não seja necessário, enquanto orElseGet() chama a função fornecida apenas se o Optional estiver vazio.

Lançando uma Exceção se o Valor Estiver Ausente

Em alguns casos, a ausência de um valor é um erro. Nessas situações, orElseThrow() pode ser utilizado para lançar uma exceção.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Aqui, se o Optional estiver vazio, o programa lança uma RuntimeException. Isso é útil quando um valor ausente representa um erro crítico.

Transformando Valores

Frequentemente, um Optional contém objetos complexos, mas pode ser necessário trabalhar apenas com campos específicos. Nesses casos, utiliza-se o map(), que aplica uma determinada função se um valor estiver presente.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Se o Optional estiver vazio, map() simplesmente retorna Optional.empty(). Caso contrário, aplica String::length e retorna um Optional<Integer>.

Filtrando valores

Em algumas situações, é necessário manter um valor apenas se ele atender a uma determinada condição. O método filter() auxilia ao reter o valor se o predicado fornecido retornar true ou ao retornar Optional.empty() caso a condição não seja atendida.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Se o comprimento da string for maior que 5, o valor é mantido; caso contrário, o Optional se torna vazio.

1. O que acontece se você chamar get() em um Optional vazio?

2. O que este código irá imprimir?

3. Qual será o resultado do código a seguir?

4. Qual método é mais adequado para fornecer um valor padrão que só é calculado quando necessário?

question mark

O que acontece se você chamar get() em um Optional vazio?

Select the correct answer

question mark

O que este código irá imprimir?

Select the correct answer

question mark

Qual será o resultado do código a seguir?

Select the correct answer

question mark

Qual método é mais adequado para fornecer um valor padrão que só é calculado quando necessário?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5
some-alt