What are Optional
types?
Basically, every method that might return a null
value will return an Optional in AT4J. This is a way to avoid NullPointerException
s in your code. This type was introduced in Java 8 and is a container object that may or may not contain a non-null value. If a value is present, isPresent()
will return true
, and get()
will return the value.
Old code:
TranslationResponse translation = azureApi.translate(text).join();
if (translation != null) {
translation.getFirstResult().getTranslations().forEach(ExampleApi::log);
}
New code:
azureApi.translate(text).ifPresent(response ->
response.getFirstResult().getTranslations().forEach(ExampleApi::log));
You can imagine an Optional like a box that may or may not contain a value. Before accessing this value, you have to unpack this box first.
Methods
get()
CAUTION
You should avoid using the get
method as it can throw a NoSuchElementException
if the value is not present. It is recommended to use the isPresent
method to check if the value is present before calling the get
method. If you are sure that the value is present, you can use the orElse
method to provide a default value if the value is not present.
The get
method returns the value if present, otherwise throws a NoSuchElementException
.
TranslationResponse translation = azureApi.translate(text).get();
translation.getFirstResult().getTranslations().forEach(ExampleApi::log);
isPresent()
The isPresent
method returns true
if the Optional
contains a non-null value, otherwise false
.
Optional<TranslationResponse> translation = azureApi.translate(text);
if (translation.isPresent()) {
translation.get().getFirstResult().getTranslations().forEach(ExampleApi::log);
}
ifPresent(Consumer<? super T> consumer)
The ifPresent
method takes a Consumer
as an argument and executes the consumer if the Optional
contains a non-null value.
azureApi.translate(text).ifPresent(response ->
response.getFirstResult().getTranslations().forEach(ExampleApi::log));
orElse(T other)
The orElse
method returns the value if present, otherwise returns the specified value.
TranslationResponse translation = azureApi.translate(text).orElse(new TranslationResponse());
translation.getFirstResult().getTranslations().forEach(ExampleApi::log);
orElseGet(Supplier<? extends T> other)
The orElseGet
method returns the value if present, otherwise returns the result of the specified Supplier
.
TranslationResponse translation = azureApi.translate(text).orElseGet(() -> new TranslationResponse());
translation.getFirstResult().getTranslations().forEach(ExampleApi::log);
orElseThrow()
The orElseThrow
method returns the value if present, otherwise throws an exception.
TranslationResponse translation = azureApi.translate(text).orElseThrow();
translation.getFirstResult().getTranslations().forEach(ExampleApi::log);
map(Function<? super T, ? extends U> mapper)
The map
method applies the given function to the value if present, otherwise returns an empty Optional
.
Optional<String> translation = azureApi.translate(text).map(response -> response.getFirstResult().getTranslations().getFirst().getText());
translation.ifPresent(System.out::println);
filter(Predicate<? super T> predicate)
The filter
method returns an Optional
containing the value if present and the value matches the given predicate,
Optional<Translation> translation = azureApi.translate(text).flatMap(response -> response.getFirstResult().getTranslations().stream().findFirst());
translation.filter(t -> t.getLanguageCode().equals("en")).ifPresent(ExampleApi::log);
flatMap(Function<? super T, Optional<U>> mapper)
The flatMap
method applies the given function to the value if present, otherwise returns an empty Optional
.
Optional<Translation> translation = azureApi.translate(text).flatMap(response -> response.getFirstResult().getTranslations().stream().findFirst());
translation.ifPresent(ExampleApi::log);