Optional != @Nullable
Jed Wesley-Smith
jed.wesleysmith at gmail.com
Sun Sep 30 15:36:20 PDT 2012
The major difference isn't really about the syntax – which I think gets a
bit too much attention, its important, but it isn't the most important
thing – its about the type.
My original point is that if we return T we don't know from that whether it
is optional or not. We may have documentation or annotation to hint to us
that it is, or isn't, but the *type signature* is just T. A type of
Option<String> is undoubtedly and unambiguously optional, and we cannot
access the inner value unsafely (modulo the unsafe get() method).
In other words, Option<T> is transitive. Consider the following:
public static Option<Integer> getProperty(String name)
If I somehow try and return this:
Integer doStuff() {
…
return getProperty(name); // compile error, need Integer, got
Option<Integer>
}
however, with this:
public static Integer getProperty(String name)
What happens if I pass a non-existent name? You cannot tell with reading
the docs or looking at the source. Even if I annotate the method, when I
call it as above I lose that annotation, it is *not transitive*. This is
the real benefit of Option<T> and its close relative Either<X, T>.
On 1 October 2012 06:19, Zhong Yu <zhong.j.yu at gmail.com> wrote:
> On Sun, Sep 30, 2012 at 2:54 PM, Sam Pullara <sam at sampullara.com> wrote:
>
> static String address(InetSocketAddress sa) {
> return elvis(elvis(sa, sa -> sa.getAddress()), ia ->
> ia.getHostAddress());
> }
>
> compared to Jed's syntax (to be fair, assume getAddress() etc all
> return Option<> type)
>
> static Option<String> address(Option<InetSocketAddress> sa) {
> return
> sa.flatMap(sa->sa.getAddress()).flatMap(ia->ia.getHostAddress());
> }
>
> there isn't much difference in wordiness between the two camps.
>
> So the real question is, returning Option<> is more strongly typed;
> but is it *too* strongly typed? Would some people find it annoying
> like C++'s const?
>
> Zhong Yu
>
>
More information about the lambda-dev
mailing list