RFR: 8015317: Optional.filter, map, and flatMap
Henry Jen
henry.jen at oracle.com
Sat Jul 13 18:49:35 UTC 2013
I think the type you talking about here is Optional<? extends U> instead of ? extends Optional<U>.
IIRC, Optional<? extends U> is not a subtype of Optional<U>, just like any other Collection class. List<Child> is not a List<Parent>.
Cheers,
Henry
On Jul 13, 2013, at 3:15 AM, Jed Wesley-Smith <jed at wesleysmith.io> wrote:
> > The ? extends Optional is unnecessary in flatMap as Optional is final.
>
> interestingly enough, it actually is.
>
> try the following test:
>
> class OptionalTest {
> class Parent {};
>
> class Child extends Parent {};
>
> @Test public void covariantReturn() {
> Optional<Parent> some = some(new Parent());
> Function<Parent, Optional<Child>> f = new Function<Parent, Optional<Child>>() {
> @Override public Optional<Child> apply(Parent p) {
> return some(new Child());
> }
> };
> Optional<Parent> mapped = some.<Parent> flatMap(f);
> assertThat(mapped.get(), notNullValue());
> }
> }
>
> adapted from the fugue test suite:
>
> https://bitbucket.org/atlassian/fugue/src/96a65067fb7aaf1edae1bffa07167a5865cbebec/src/test/java/com/atlassian/fugue/OptionTest.java#cl-155
>
> The point to remember is that Optional<Child> is a type and as such is actually a subtype of Optional<Parent> – and therefore requires a covariant return.
>
> cheers,
> jed.
>
>
>
>
> On 13 July 2013 04:15, Mike Duigou <mike.duigou at oracle.com> wrote:
> The ? extends Optional is unnecessary in flatMap as Optional is final. Otherwise this looks good.
>
> Mike
>
> On Jul 5 2013, at 14:37 , Henry Jen wrote:
>
> > Hi,
> >
> > Please review the webrev at
> >
> > http://cr.openjdk.java.net/~henryjen/ccc/8015317.0/webrev/
> >
> > Which adds following method to Optional,
> >
> > public static <T> Optional<T> ofNullable(T value) {}
> > public Optional<T> filter(Predicate<? super T> predicate) {}
> > public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {}
> > public<U> Optional<U> flatMap(Function<? super T, ? extends Optional<U>>
> > mapper) {}
> >
> > Also included is some cleanup on javadoc.
> >
> > Cheers,
> > Henry
>
>
>
More information about the core-libs-dev
mailing list