Primitive streams and optional (original) (raw)

Tim Peierls tim at peierls.net
Tue Nov 20 14:43:23 PST 2012


What happened to min(int defval)? That way the library doesn't have to decide on a good default, but the user can.

--tim

On Tue, Nov 20, 2012 at 5:14 PM, Brian Goetz <brian.goetz at oracle.com> wrote:

We're working through implementing the primitive specialization of streams now. So far, its pretty straightforward; many of the ops on reference streams have an obvious analogue (e.g., filter, map, forEach), and many are just not applicable (e.g., into, since there are no primitive collections.) There are also a number of additional methods that make sense on primitive streams, such as sum(). (You can see the work in progress in the lambda repo.)

The tricky ones are the ones that return some sort of Optional. For sum() there is an obvious value to return if there are no elements in the stream (zero), but for min/max/average, it would require more distortion to avoid optionality. We can't expect users to know a priori whether the stream is empty. Example: int firstOrderNumber customers.flatMap(c -> /* c.orders */) .map(o -> o.getOrderId()) .min(); The options are: - throw NSEE - make up a bad default (e.g., MAXVALUE for min) - return an Optional - return an OptionalInt The first two are pretty bad, and are asymmetric to the reference streams. Creating N new OptionalXxx classes is kind of annoying and bloaty. (There's an argument to be made for "Well, we're boxing once at the end anyway, boxing twice with Optional isn't terrible.") Though I suspect that will be an ongoing irritant. Are there other "options"?



More information about the lambda-libs-spec-observers mailing list