Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are Optional's or and flatMap methods' supplier type parameters wildcards?

The Optional.or method was added in Java 9. This is the method signature

public Optional<T> or​(Supplier<? extends Optional<? extends T>> supplier) 

Why is the type parameter of the Supplier taking ? extends Optional rather than just Optional, since Optional is a final class?

The same is true for the Optional.flatMap method. This is a change from Java 8.

In Java 8, it was Function<? super T, Optional<U>> mapper whereas it was changed to Function<? super T,​? extends Optional<? extends U>> in Java 9.

like image 243
user7 Avatar asked Dec 10 '18 01:12

user7


People also ask

What is the difference between flatMap () and map () functions?

Both of the functions map() and flatMap are used for transformation and mapping operations. map() function produces one output for one input value, whereas flatMap() function produces an arbitrary no of values as output (ie zero or more than zero) for each input value.

What is flatMap used for?

Array.prototype.flatMap() The flatMap() method returns a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level.

Does flatMap preserve order?

Does flatmap() method preserve the order of the streams? Yes, It does and map() also.

What is flat operation in Java?

In Java 8 Streams, the flatMap() method applies operation as a mapper function and provides a stream of element values. It means that in each iteration of each element the map() method creates a separate new stream. By using the flattening mechanism, it merges all streams into a single resultant stream.


1 Answers

I found the reasoning behind this from Stuart Marks himself

http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-October/044026.html

This has to do with nested generics (Optional is nested within Function). From the mail thread

 Function<..., Optional<StringBuilder>> 

is not a subtype of

 Function<..., Optional<? extends CharSequence>> 

To get around this, we have to add the outer wildcard as well, so that

 Function<..., Optional<StringBuilder>> 

is a subtype of

 Function<..., ? extends Optional<? extends CharSequence>> 
like image 50
user7 Avatar answered Sep 17 '22 18:09

user7