Survey on map/flatMap disambiguation
Brian Goetz
brian.goetz at oracle.com
Tue Mar 19 08:22:55 PDT 2013
Thanks for writing up your concerns all in one place.
> 1. Performance gotchas?
Of these, I think this is the worst of the concerns. However, I also
think its not as bad as it sounds. When a user hits ctrl-space in the
IDE, they'll see (close to each other) all the mapToXxx forms, which has
actually a lot of educational value. [1]
Secondly, while boxed performance is definitely much worse than
non-boxed, for small streams (and most collections are small), it might
not make a difference anyway. I've definitely had the experience many
many times of discovering "egregious" performance "bugs" like this that
turned out to have no effect on actual business-relevant performance
metrics, because all the cost was in the { XML parsing, database access,
network latency, crypto, etc }. For those cases where it does make a
difference, profiling will disclose this immediately. So its a gotcha,
but not a disaster.
So I think its a gotcha but nothing so bad that this makes the
difference for me.
> 2. Consistency. What about other similar methods?
>
> My main concern is that this change will (or should?) cascade to other
> methods, and, in the end, a patch that need only be applied to flatMap
> ripples through the entire API.
I did a quick look and didn't see any other obvious examples of this
pattern, where we've overloaded methods for all the X-to-Y stream
conversions. Did you find any ripples I missed?
> 3. Breaks map/reduce functional feel?
>
> The other concern that I stated previously is that this mars the
> familiar map/reduce functional feel, without helping enough with the
> usability or readability. Either way, an IDE will be indispensable.
This is obviously subjective but for me it felt OK.
[1] Educating people that there are multiple stream shapes, whose
methods are similar but not exactly the same, is important. Calling all
the methods "map" may make people believe that there's a sum() method on
Stream, and be surprised when there is not. But .mapToInt(...).sum()
makes it more obvious what is going on here, which is arguably a plus.
More information about the lambda-libs-spec-experts
mailing list