Hello!

Tomasz, Peter, Stuart, Remi, thank you for review and comments. I
updated the webrev:
http://cr.openjdk.java.net/~tvaleev/webrev/8205461/r5/
1. ? extends R -> R
2. parameter names c1, c2 -> downstream1, downstream2;
Objects.requireNonNull messages updated correspondingly

merger is left as is. I think it's fine.

>> Returns a {@code Collector} that is a composite of two downstream collectors.
>
> even though it uses "composite" which is not the name of this collector. But 
> I think it's a more descriptive term and it reads more smoothly.

I also think that using a different word in description is fine. It
could be helpful for non-native speakers (some may better understand
'duplex', others are more familiar with 'composite').

CSR is also updated:
https://bugs.openjdk.java.net/projects/JDK/issues/JDK-8209685

With best regards,
Tagir Valeev.

On Sat, Sep 15, 2018 at 12:09 AM Stuart Marks <stuart.ma...@oracle.com> wrote:
>
> Hi Tagir, thanks for the update.
>
> Also thanks Tomasz for keeping everybody honest on the open issues.
>
> First, naming. I think "duplex" as the root word wins! Using "duplexing" to 
> conform to many of other collectors is fine; so, "duplexing" is good.
>
> Unfortunately "duplex" is not really a verb. For some reason "duplexing" 
> sounds OK. This probably follows in the long tradition of the tech industry's 
> "verbing" of nouns and adjectives. However, I can't quite bring myself to 
> recommend using this in the javadoc summary sentence, e.g.,
>
> Returns a {@code Collector} that duplexes stream elements to two downstream 
> collectors.
>
> Ugh. I think the current summary sentence is fine
>
> Returns a {@code Collector} that is a composite of two downstream collectors.
>
> even though it uses "composite" which is not the name of this collector. But 
> I think it's a more descriptive term and it reads more smoothly.
>
> Turning to the issues mentioned by Tomasz:
>
> 1) Brian Goetz' suggestion of changing "? extends R" into "R":
>     - 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-August/054947.html
>
> Yes, I think this should be done.
>
> 2) Stuart Marks' suggestion about renaming "c1" and "c2" to "downstream1" and 
> "downstream2":
>     - 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-August/054949.html
>
> Yes. It's a small thing, but the parameter names do appear in the javadoc. 
> The text refers to "downstream" collectors, and naming the parameters 
> "downstream" strengthens the association to the text. Otherwise, the reader 
> has to think "what are c1 and c2? Oh, they're the downstream collectors."
>
> 3) my suggestion about renaming "merger" to "biFinisher" because "merger" 
> means BinaryOperator everywhere else:
>     - 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-September/055235.html
>
> I'm ok with "merger". I don't feel that "merge" has a strong implication that 
> the result must be the same type as the two inputs. I'm ok with the notion of 
> "merge" taking two inputs (which might be of different types) and producing a 
> single output (which might be a different type from either input). The 
> difficulty with "biFinisher" is that it doesn't seem to imply "take two 
> things and produce one". A finisher takes one input and produces one output, 
> so would a "biFinisher" take two inputs and produce two outputs?
>
> As to the name, I still think a name related to a well-understood concept 
> (like the composite pattern [1]) would be better. Note that "composite" is 
> also a verb [2], but "Collectors.compositing" looks a bit strange. 
> "Collectors.composing" seems much better to me, but - as far as I understand 
> - there was some concern that the users could misunderstand it as 
> element-wise composition, is that right?
>
> The difficulty I have with "compose" and "composition" is that with function 
> composition, one function is applied, and the second function is applied to 
> the result of the first. Of course that isn't what happens here. The notion 
> of "duplexing" is that things are happening side-by-side, which applies well 
> here, I think.
>
> **
>
> Tagir, overall, looks good! Let me know when you've finished updating the CSR.
>
> Thanks,
>
> s'marks
>
>
> Regards,
> Tomasz Linkowski
>
> [1] https://en.wikipedia.org/wiki/Composite_pattern
> [2] https://en.wiktionary.org/wiki/composite#Verb
>
>
>
> On Fri, Sep 14, 2018 at 11:23 AM, Peter Levart <peter.lev...@gmail.com> wrote:
>>
>> Hi Tagir,
>>
>> I like duplexing more than teeingAndThen. If consensus can be established 
>> about the name, I think you will then want to update the CSR draft to 
>> reflect new name. Then we'll kindly ask Stuart if he has any more advice 
>> before submitting the CSR...
>>
>> Regards, Peter
>>
>>
>> On 09/14/2018 10:41 AM, Tagir Valeev wrote:
>>>
>>> Hello, Stuart and Peter!
>>>
>>> Thank you for valuable comments. I updated the webrev:
>>> http://cr.openjdk.java.net/~tvaleev/webrev/8205461/r4/
>>>
>>> 1. I renamed "teeingAndThen" to "duplexing". Brian insisted that
>>> "-ing" suffix shall present and I agree. Hopefully it's final name.
>>> 2. I updated the spec as Stuart suggested.
>>>
>>> No changes in implementation since r3 revision. Please check.
>>>
>>> With best regards,
>>> Tagir Valeev.
>>>
>>>
>>> On Tue, Aug 21, 2018 at 12:43 PM Stuart Marks <stuart.ma...@oracle.com> 
>>> wrote:
>>>>
>>>> Hi Tagir,
>>>>
>>>> Thanks for working on this. This looks really cool! And thanks Peter for
>>>> agreeing to sponsor it.
>>>>
>>>> I can help out with the CSR. My first bit of advice about the CSR process 
>>>> is to
>>>> hold off until the specification is complete. :-)
>>>>
>>>> I think the intent of the API is fine, but I think some details of the 
>>>> returned
>>>> collector need to be ironed out first.
>>>>
>>>> 1. The spec doesn't say what the returned collector's supplier, 
>>>> accumulator,
>>>> combiner, and finisher do. On the one hand, we don't necessarily want to
>>>> describe the actual implementation. On the other hand, we need to specify 
>>>> how
>>>> the thing actually behaves. One can certainly deduce the intended behavior 
>>>> from
>>>> the description, but this really needs to be specified, and it mustn't 
>>>> rely on
>>>> the reader having to derive the required behaviors. Since the actual
>>>> implementation is fairly simple, the spec might end up being rather close 
>>>> to the
>>>> implementation, but that might be unavoidable.
>>>>
>>>> I'm envisioning something like this:
>>>>
>>>>    - supplier: creates a result container that contains result containers
>>>> obtained by calling each collector's supplier
>>>>
>>>>    - accumulator: calls each collector's accumulator with its result 
>>>> container
>>>> and the input element
>>>>
>>>> ... and similar for the combiner and finisher functions.
>>>>
>>>> 2. Characteristics
>>>>
>>>>    - UNORDERED: should the returned collector be UNORDERED if *either* of 
>>>> the
>>>> provided collectors is UNORDERED? (Current draft says *both*.)
>>>>
>>>>    - CONCURRENT: current draft seems correct
>>>>
>>>>    - IDENTITY_FINISH: clearly not present; perhaps this should be specified
>>>>
>>>> 3. Parameter naming
>>>>
>>>> The collector parameters are referred to as "specified collectors" or 
>>>> "supplied
>>>> collectors". Other "higher-order" collectors refer to their underlying
>>>> collectors as "downstream" collectors. I think it would be useful to work 
>>>> the
>>>> "downstream" concept into this collector. This would enable the opening 
>>>> summary
>>>> sentence of the doc to be something like, "Returns a collector that is a
>>>> composite of two downstream collectors" or some such. (But see naming 
>>>> below.)
>>>>
>>>> 4. Naming
>>>>
>>>> Sigh, naming is hard, and I know there was a fair amount of discussion in 
>>>> the
>>>> previous thread and earlier in this one, but it seems like there's still 
>>>> some
>>>> dissatisfaction with the name. (And I'm not particularly thrilled with
>>>> teeingAndThen myself.) In a few minutes I've managed to come up with a few 
>>>> more
>>>> names that (mostly) don't seem to have been proposed before, and so here 
>>>> they
>>>> are for your consideration:
>>>>
>>>>    - compound
>>>>    - composite
>>>>    - conjoined
>>>>    - bonded
>>>>    - fused
>>>>    - duplex
>>>>
>>>> Discussion:
>>>>
>>>> A "composite" evokes function composition; this might be good, though it 
>>>> might
>>>> be odd in that collectors can't be composed in the same way that functions 
>>>> are.
>>>>
>>>> "Compound" might be a useful alternative. In chemistry, two substances are
>>>> combined (or bonded, or fused) to form a single substance, which is a 
>>>> compound.
>>>>
>>>> "Conjoin" seems to adequately describe the structure of the two 
>>>> collectors, but
>>>> it lacks somewhat the connotation of unifying them.
>>>>
>>>> In an earlier discussion, Brian had pushed back on names related to
>>>> split/fork/merge/join since those are currently in use in streams regarding
>>>> splitting of input elements and merging of results. In describing how the
>>>> current proposal differs, he said that elements are "multiplexed" to the
>>>> different collectors. Since we're doing this with two collectors, how about
>>>> "duplex"? (I note that Jacob Glickman also had suggested "duplex".)
>>>>
>>>> s'marks
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On 8/20/18 1:48 AM, Tagir Valeev wrote:
>>>>>
>>>>> Hello!
>>>>>
>>>>> A CSR is created:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8209685
>>>>> (this is my first CSR, hopefully I did it correctly)
>>>>>
>>>>> With best regards,
>>>>> Tagir Valeev.
>>>>> On Mon, Aug 20, 2018 at 2:06 PM Peter Levart <peter.lev...@gmail.com> 
>>>>> wrote:
>>>>>>
>>>>>> Hi Tagir,
>>>>>>
>>>>>> I think this looks very good. It just needs a CSR. Will you file it?
>>>>>>
>>>>>> Regards, Peter
>>>>>>
>>>>>> On 08/19/2018 11:24 AM, Tagir Valeev wrote:
>>>>>>
>>>>>> Hello, Brian!
>>>>>>
>>>>>> Of the three phases, teeing is the most important and least obvious, so
>>>>>> I think something that includes that in the name is going to be
>>>>>> helpful.  Perhaps "teeingAndThen" is more evocative and not totally
>>>>>> unwieldy.
>>>>>>
>>>>>> Ok, sounds acceptable to me. Renamed pairing to teeingAndThen.
>>>>>>
>>>>>> By the way looking into CollectorsTest.java I found some minor things to
>>>>>> cleanup:
>>>>>> 1. `.map(mapper::apply)` and `.flatMap(mapper::apply)` can be replaced 
>>>>>> with
>>>>>> simple `.map(mapper)` and `.flatMap(mapper)` respectively
>>>>>>
>>>>>> Does IntelliJ have an inspection for eliminating such locutions?
>>>>>>
>>>>>> Sure, that's how I found them. Well, I took the liberty to fix these two 
>>>>>> things.
>>>>>>
>>>>>> 2. In many methods redundant `throws ReflectiveOperationException` is
>>>>>> declared while exception is never thrown
>>>>>>
>>>>>> For test code where a significant fraction of test cases are going to
>>>>>> throw something, we often do this, since its easier to just uniformly
>>>>>> tag such methods rather than thinking about which test methods actually
>>>>>> throw the exception and which don't.  So I think this is harmless
>>>>>> (though cleaning it up is harmless too.)
>>>>>>
>>>>>> I'm not thinking about this, because my IDE thinks for me :-) Ok, I'll
>>>>>> leave them as is for now.
>>>>>>
>>>>>> You may want to optimize the EnumSet mechanics for the case where
>>>>>> neither collector has interesting characteristics.
>>>>>>
>>>>>> Added a special case when reported characteristics for either of
>>>>>> collectors are empty or IDENTITY_FINISH only.
>>>>>> I think this should be a common case.
>>>>>>
>>>>>> The updated webrev is posted here (along with Peter suggestion to
>>>>>> rename finisher to merger):
>>>>>> http://cr.openjdk.java.net/~tvaleev/webrev/8205461/r3/
>>>>>> Also copyright year is updated
>>>>>>
>>>>>> With best regards,
>>>>>> Tagir Valeev
>>>>>>
>>>>>>
>>
>
>
>
> --
> Pozdrawiam,
> Tomasz Linkowski
>
>

Reply via email to