Hi Peter, Existing composing collectors tend to unpack all the functions of the input collector ahead of time, i don’t recall being too concerned about this at the time. It does allow for more robust null checking, something we were less diligent about doing.
Paul. > On Jun 17, 2018, at 3:04 AM, Peter Levart <peter.lev...@gmail.com> wrote: > > Hi Tagir, > > I don't know if this is important, but in your approach the particular > functions of the sub-collectors are retrieved eagerly even if they are later > not used. This should typically not present a problem as Collector(s) should > be prepared to be used in any scenario (parallel or serial). But anyway in my > approach, the sub-functions of the given collectors are retrived lazily, each > time the Stream implementation needs them - the dynamics of invoking > sub-collector methods to retrieve the functions is therefore unchanged when a > collector is used directly to collect a Stream or as a sub-collector in the > bi-collection scenario. > > What do you think of that particular detail? Paul? > > Regards, Peter > > On 06/15/18 13:26, Tagir Valeev wrote: >> Hello! >> >> I created a preliminary webrev of my own implementation (no testcases yet): >> http://cr.openjdk.java.net/~tvaleev/patches/pairing/webrev/ >> <http://cr.openjdk.java.net/%7Etvaleev/patches/pairing/webrev/> >> If anybody wants to sponsor my implementation, I will happily log an issue >> and write tests. >> >> The name "pairing" was invented by me, but as I'm not a native English >> speaker I cannot judge whether it's optimal, so better ideas are welcome. >> Also I decided to remove accumulator types from public type variables. They >> do not add anything to type signature, only clutter it >> increasing the number of type parameters from 4 to 6. I think it was a >> mistake to expose the accumulator type parameter in other cascading >> collectors >> like filtering(), collectingAndThen(), groupingBy(), etc. I'm not insisting >> though, if you feel that conformance to existing collectors is >> more important than simplicity. >> >> With best regards, >> Tagir Valeev. >> >> On Fri, Jun 15, 2018 at 5:05 AM Brian Goetz <brian.go...@oracle.com >> <mailto:brian.go...@oracle.com>> wrote: >> >> > Well, I don't see the need to pack the two results into a Map.Entry >> > (or any similar) container as a drawback. >> >> From an "integrity of the JDK APIs" perspective, it is unquestionably a >> drawback. These items are not a Key and an associated Value in a Map; >> it's merely pretending that Map.Entry really means "Pair". There's a >> reason we don't have a Pair class in the JDK (and no, let's not reopen >> that now); using something else as a Pair proxy that is supposed to have >> specific semantics is worse. (It's fine to do this in your own code, but >> not in the JDK. Different standards for code that has different audiences.) >> >> Tagir's proposed sidestepping is nice, and it will also play nicely with >> records, because then you can say: >> >> record NameAndCount(String name, int count); >> >> stream.collect(pairing(collectName, collectCount, NameAndCount::new)); >> >> and get a more properly abstract result out. And its more in the spirit >> of existing Collectors. If you want to use Map.Entry as an >> _implementation detail_, that's fine. >> >> I can support this form. >> >> > I also don't see a larger abstraction like BiStream as a natural fit >> > for a similar thing. >> >> I think the BiStream connection is mostly tangential. We tried hard to >> support streams of (K,V) pairs when we did streams, as Paul can attest, >> but it was a huge complexity-inflater and dropping this out paid an >> enormous simplification payoff. >> >> With records, having streams of tuples will be simpler to represent, but >> no more performant; it will take until we get to value types and >> specialized generics to get the performance we want out of this. >> >> >