JEP 186: Collection Literals

Jochen Theodorou blackdrag at gmx.org
Tue Jan 14 11:29:51 PST 2014


If I follow that train of thought, then I see the following (ignore 
syntax please):

HashSet<> set = [1,2,3] //#1
LinkedList<> list = [1,2,3,4] //#2
MyFavoritStruct struct = [a,b,c] //#3

That means, the rhs is only a kind of compile time tuple and gets its 
real meaning only through the lhs. The compiler could for example 
transform #1 into: HashSet<Integer> set = new HashSet<Integer>(1,2,3). 
Meaning the line #1 is valid if there is a fitting constructor (or 
helper method). And it would be easy for the user to let his structures 
fit in here (#3). But for example Object o = [1,2,3] is not valid then.

I think leveraging the constructor for that has a lot of heated 
discussion potential. And besides that bigger nested structures will 
easily become a hurdle. But I wanted to speak out, what seemed to lay on 
your tongue here in my eyes ;)

Though, you may not have meant that, because List<...> l = [1,2,3] would 
then not be valid, unless you go through a (static) helper method 
defined in List. And the discussion what exact type l will have will be 
interesting... started here already actually. And I think there will be 
no "fits all" type.


Am 14.01.2014 18:02, schrieb Brian Goetz:
> And, we have now reached our quota of syntax discussion on this topic.
> No more, please!  Such discussions get in the way of the important
> questions like:
>
>    - what does this feature *mean*
>    - what should the limits of this feature be
>    - how does this map to bytecode
>
>> Problem is that you need to differentiate list and set (and map possibly).
>
> This need not be done syntactically.  We now have precedent and
> machinery for using /target typing/ here.  Let's assume the syntactic
> problems will be solved when we figure out what this feature ought to be.
>
> For example, the two lambdas below are syntactically identical, but the
> type system knows what they need to be converted to:
>
>     Function<String, Boolean> f = s -> s != null;
>     Predicate<String> g = s -> s != null;
>
> The same is true for distinguishing linear collections like arrays,
> lists, and sets.
>
> The real question is "how far do we go."  The original Coin proposal
> stopped at sets, lists, and maps (and had a different syntax for each.)
>    But this seems kind of lame; why can't something that is List-like but
> not a java.util.List participate?
>
>
> On 1/14/2014 11:19 AM, Paul Benedict wrote:
>> I think you could likely achieve all those with curly braces. You'll have
>> the help of type inference during assignment (list vs set) plus you can
>> nest values whenever you need tuples (maps).
>>
>>
>> On Tue, Jan 14, 2014 at 10:16 AM, Artur Biesiadowski <abies at adres.pl> wrote:
>>
>>> Problem is that you need to differentiate list and set (and map possibly).
>>>
>>> Few examples from existing languages
>>>
>>> Groovy:
>>>
>>> List  [1,2,3]
>>> Set   [1,2,3] as Set
>>> Map   ["a":1, "b":2]
>>>
>>> Xtend
>>>
>>> List  #[1,2,3]
>>> Set   #{1,2,3}
>>> Map   #{"a"->1, "b"->2}
>>>
>>> Scala
>>>
>>> List  Array(1,2,3)
>>> Set   Set(1,2,3)
>>> Map   Map("a"->1, "b"->2)
>>>
>>> C#
>>>
>>> List  new List<int> {1,2,3}
>>> Set new HashSet<int> {1,2,3}
>>> Map   new Dictionary<string,int>  { {"a":1},{"b":2}  }
>>>
>>>
>>>
>>> Regards,
>>> Artur Biesiadowski
>>>
>>> On 14/01/2014 16:30, Paul Benedict wrote:
>>>> I would like to see Java have one way of doing initialization with a
>>> series
>>>> of values. C11/C++11 decided that curly braces was the way to go. So I
>>>> would agree with Moshe we should favor curly braces over any new syntax.
>>>>
>>>>
>>>> On Tue, Jan 14, 2014 at 8:34 AM, Millies, Sebastian <
>>>> Sebastian.Millies at softwareag.com> wrote:
>>>>
>>>>> I would certainly expect it to be an immutable list, and I believe the
>>>>> proposal of having collection literals makes most sense in the context
>>> of
>>>>> persistent collections. This would be in keeping with evolving Java
>>> towards
>>>>> a more functional and parallel-friendly programming style, which entails
>>>>> embracing immutability. In contrast, what's to be gained from a shorter
>>>>> version of Arrays.asList() ?  -- Sebastian
>>>>>
>>>>> -----Original Message-----
>>>>> From: lambda-dev-bounces at openjdk.java.net [mailto:
>>>>> lambda-dev-bounces at openjdk.java.net] On Behalf Of Moshe Sayag
>>>>> Sent: Tuesday, January 14, 2014 2:52 PM
>>>>> To: lambda-dev at openjdk.java.net
>>>>> Subject: Re: JEP 186: Collection Literals
>>>>>
>>>>> 1. What is the exact meaning of:
>>>>>
>>>>> List<Integer> list = #[ 1, 2, 3 ];
>>>>>
>>>>> Will 'list' be an ArrayList, a LinkedList or an immutable list?
>>>>>
>>>>> 2. Java already has the curly brackets {...} to construct an array.
>>>>>
>>>>> int[] array = { 1, 2, 3 };
>>>>>
>>>>> How will the new literal go with it?
>>>>> Will we have:
>>>>>
>>>>> int[] array = #[ 1, 2, 3 ];
>>>>>
>>>>> What about
>>>>>
>>>>> List<Integer> list = { 1, 2, 3 };
>>>>>
>>>>>
>>>>> Moshe
>>>>>
>>>>>
>>>>> On Tue, Jan 14, 2014 at 2:17 AM, <mark.reinhold at oracle.com> wrote:
>>>>>
>>>>>> Posted: http://openjdk.java.net/jeps/186
>>>>>>
>>>>>> - Mark
>>>>>>
>>>>>>
>>>>>
>>>>> Software AG – Sitz/Registered office: Uhlandstraße 12, 64297 Darmstadt,
>>>>> Germany – Registergericht/Commercial register: Darmstadt HRB 1562 -
>>>>> Vorstand/Management Board: Karl-Heinz Streibich (Vorsitzender/Chairman),
>>>>> Dr. Wolfram Jost, Arnd Zinnhardt; - Aufsichtsratsvorsitzender/Chairman
>>> of
>>>>> the Supervisory Board: Dr. Andreas Bereczky - http://www.softwareag.com
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>
>>
>


-- 
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org



More information about the lambda-dev mailing list