list literal gotcha and suggestion

John Hendrikx hjohn at xs4all.nl
Wed Sep 30 00:14:00 PDT 2009


Varargs constructors for the various Sets and Lists would have solved a 
lot of problems already and would also fit nicely with the call for 
standard utility methods in java.util/lang.  Any enhancement that gets 
rid of the Arrays.asList(...) construct would be most helpful.

Maps however would remain a pain to instantiate.  So a good syntax for 
creating maps or more generally, pairs or groups of values would 
alleviate that.  Personally I was thinking more along the lines of 
providing a constructor like this for Maps:

  public HashMap(Pair<K, V>... pairs);

With some new syntax to easily create Pairs:

  Pair<Integer, String> p = {1: "A"};

Resulting in:

 new HashMap<Integer, String>({1: "A"}, {2: "B"}, {3: "C"});

It's a bit more verbose than the proposed syntax, but it has the 
advantage of also offering a standard way for returning pairs of values 
(from a map) and for adding single entries:

  for(Pair<K, V> pair : map) {
  }

  myMap.add({4: "D"});

etc..

--
John Hendrikx


Greg Brown wrote:
> I know this proposal has already been approved for inclusion in Java  
> 7, but it really seems like it might not be worth the effort. Wouldn't  
> it be simpler to just add a varargs constructor to the collection  
> classes? To me, this:
>
> List<String> list = ["a", "b", "c"];
>
> isn't much better than:
>
> List<String> list = new ArrayList<String>("a", "b", "c");
>
> With the improved type inference feature, declarations such as this  
> will be even less verbose.
>
> I recognize that maps are trickier, but I still think that this:
>
> Map<String, Integer> map = new HashMap<String, Integer>(new  
> AbstractMap.SimpleImmutableEntry<String, Integer>("a", 0),
> 	new AbstractMap.SimpleImmutableEntry<String, Integer>("b", 1),
> 	new AbstractMap.SimpleImmutableEntry<String, Integer>("c", 2));
>
> is preferable to modifying the language for what (to me) seems like a  
> fairly marginal use case.
>
> Greg
>
>
> On Sep 29, 2009, at 5:53 AM, Stephen Colebourne wrote:
>
>   
>> Over the 1.4million LOC codebase I work on, I found 12 set literals.
>> We're not talking about large numbers. Interestingly, the majority of
>> these were constants, and may be more common than list constants.
>> There weren't any cases of parameter passing of a set literal.
>>
>> That said, I strongly dislike the confusion apparent here. We should
>> avoid new puzzlers if possible. I'd prefer
>>
>> List<String> list = {"1", "2", "3"} - List literal
>> Map<Integer, String> list = {1 : "1", 2 : "2", 3 : "3"} - Map literal
>> No set literal
>> (I don't think this conflicts with the array literals...)
>>
>> Perhaps there is also an argument for adding the static of methods to
>> construct mutable Set/List:
>>
>> Set<String> set = HashSet.of("1", "2", "3");  // mutable set
>> List<String> list = ArrayList.of("1", "2", "3");  // mutable list
>> List<String> list2 = {"1", "2", "3"};  // immutable list
>>
>>
>> One final thought. It would be possible to add a "method" to the  
>> list literal:
>>
>> Set<String> set = {1, 2, 3}.toSet();  // immutable set
>>
>> This approach would handle additional interfaces too:
>>
>> SortedSet<String> set = {1, 2, 3}.toSortedSet();  // immutable  
>> sorted set
>> MultiSet<String> mset = {1, 2, 3}.toMultiSet();  // immutable
>> multiset/bag (if added to JDK)
>>
>> Stephen
>>
>>
>> 2009/9/29 Reinier Zwitserloot <reinier at zwitserloot.com>:
>>     
>>> Scanning my codebase, they are quite rare. As the set literals are
>>> causing rather a lot of pain, let's see some proof before going too
>>> far down this road.
>>>
>>> Pain caused by set literals:
>>>
>>>  - ambiguity of {} - is that the empty set or the empty map?
>>>  - set/list confusion.
>>>  - the parser becomes quite a bit more complicated to handle the
>>> difference between sets and maps.
>>>
>>>  --Reinier Zwitserloot
>>>
>>>
>>>
>>> On 2009/29/09, at 10:02, Mark Thornton wrote:
>>>
>>>       
>>>> Reinier Zwitserloot wrote:
>>>>         
>>>>> new HashSet<>(["a", "b", "c"]);
>>>>>
>>>>> is too much effort in the rare cases where you need to initialize a
>>>>> set-typed parameter? This is java, not perl. Golfing isn't the end
>>>>> goal.
>>>>>
>>>>>           
>>>> Without scanning my codebase I wouldn't expect Set parameters and
>>>> fields to be rare. I use Set's quite frequently.
>>>>
>>>> Mark Thornton
>>>>
>>>>         
>>>
>>>       
>
>
>   




More information about the coin-dev mailing list