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
Quizzes & Challenges
Quizzes
Challenges
/
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

Suggested prompts:

What are some common methods provided by the Optional class?

Can you give examples of how to use Optional in Java?

Why is using Optional considered better than checking for null directly?

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