Manipulaçã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 umOptionalvazio, 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 sejanull, criando umOptionalpreenchido ou vazio.
Main.java
123456789101112131415package 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
12345678910package 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
123456789101112131415161718package 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
123456789101112131415package 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
123456789101112package 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
123456789101112package 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
123456789101112package 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?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.33
Manipulaçã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 umOptionalvazio, 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 sejanull, criando umOptionalpreenchido ou vazio.
Main.java
123456789101112131415package 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
12345678910package 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
123456789101112131415161718package 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
123456789101112131415package 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
123456789101112package 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
123456789101112package 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
123456789101112package 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?
Obrigado pelo seu feedback!