On Thu, 15 Oct 2026 11:41:15 GMT, Viktor Klang <[email protected]> wrote:

>> I updated the PR according to the latest suggestions:
>> - ListFormat.toCollector restored
>> - Collectors.joining(ListFormat) replaced with joiningConjunctively and 
>> joiningDisjunctively accepting a Locale
>> - Every collector now produces an empty string for the empty stream.
>
> @amaembo Thanks for your patience. I've taken some time to think about this 
> PR.
> 
> Currently I am a bit on the fence about this feature, and I think that there 
> are a couple of questions I think needs some elucidation before deciding how 
> to move forward.
> 
> 1. We currently don't really have any APIs that produce Collector instances 
> outside of Collector and Collectors.
> 2. What's the likelyhood of someone looking for this Internalization-feature 
> will look for it in Collectors? I can definitely see that if they find 
> ListFormat they might discover a toCollector()-feature, however how likely is 
> it for someone to be looking at Collectors.joining to decide that 
> "joiningDisjunctively" vs "joiningConjunctively" is the right choice for them?
> 
> I suspect that what we'll see is that there is a split between users coming 
> to this from ListFormat and some who come from Collectors. What's uncertain 
> to me, at this time, is if this is 50/50 or 90/10.
> 
> At the end of the day, I want to make sure that we expand the API surface for 
> the right reasons and with care.

Hi, @viktorklang-ora 

Regarding 1, I think that until now all collectors we had were very generic and 
related to core APIs (collections, basic math, string concatenation). On the 
other hand, internationalization is not that basic API, and it looks natural to 
have a collector closer to the API than in the common `Collectors` class. It 
also allows the collector to potentially access the `ListFormat` internals, 
which may open room for optimization. It's quite possible that we may have 
API-specific collectors in the future. For example, one may want to collect to 
JsonArray if we have JSON API. Having such a collector somewhere near the 
JsonArray class would be more natural. You may also compare with stream 
sources. We have basic sources in the `Stream` class, like 
`of/iterate/generate`, but many domain-specific sources are in corresponding 
classes outside Stream API.

Regarding 2, I think that many developers today simply use `joining(", ")`, 
because it's good enough for them, and they don't bother formatting in a better 
way. Now, they will see new options like `joiningConjunctively` and may easily 
discover that at a very low cost they can make the output more user-friendly, 
even if their application is English-only. I think it's good to have common 
options next to `joining`, as this will promote internationalization in general 
and increase the amount of properly internationalized code. Probably some 
people using `Collectors` were not aware at all that Java includes such great 
internationalization capabilities. Discovering `joiningConjunctively` people 
may eventually discover `ListFormat` and other formatting features, which could 
be educational.

On the other hand, people who already know about `ListFormat` and care about 
proper message formatting, may discover `toCollector` method inside 
`ListFormat`, and migrate existing code like `lf.format(stream.toList())` to 
`stream.collect(lf.toCollector())` making it more fluent and potentially more 
performant.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/32716#issuecomment-6231575277

Reply via email to