Primitive streams
Kasper Nielsen
kasperni at gmail.com
Fri Jan 4 03:14:09 PST 2013
On Sat, Dec 29, 2012 at 7:19 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
>
>>
> you can't define sum() on Stream
>
you could if you defined some kind of java.lang.Addable interface similar
to java.lang.Comparable.
*public* *interface* *class* Addable<T *extends* Addable<T>> {
T add(T other);
default T addAll(Iterable<T> iterable) {
Iterator<T> i = iterable.iterator();
T result = i.next();// must have at least one element
*while* (i.hasNext()) {
result = result.add(i.next());
}
*return* result;
}
}
You could then let BigInteger, Integer, String?, ComplexNumber, AtomicLong,
.... implement it like this
public class Integer implements Comparable<Integer>, Addable<Integer> {
Integer add(Integer other) {
*return* *new* Integer(i + other.i);
}
Integer addAll(Iterable< Integer > iterable) {
Iterator< Integer > i = iterable.iterator();
*int* result = i.next().i;
*while* (i.hasNext()) {
result += i.next().i;
}
*return* *new* Integer(result);
}
}
On Stream you could then have
@throws ClassCastException if elements are not mutable addable
@throws NullPointerException if encountering a null
Optional<T> sum();
It would be really useful especially when working with something like
BigInteger and BigDecimal. Where the addAll() could speed up adding lots of
BigIntegers considerable.
In a crazy world you could even use it to provide operator overloading of +.
More information about the lambda-libs-spec-observers
mailing list