Proposal: Indexing access syntax for Lists and Maps

Derek Foster vapor1 at teleport.com
Tue Apr 21 21:47:06 PDT 2009


I like your idea of including Set as well. I think it makes intuitive sense with regards to a set as a quality of its members. (e.g. the set "blue" has members which are blue, and thus "blue[x]" represents "is x blue?"

However, if we were to do so, I think that "bool foo = (set[y] = bar)" should always result in 'foo' being equal to 'bar', not in it getting the assigned the return value of set.add() or set.remove() as your desugaring implies.

Derek



-----Original Message-----
>From: Tim Keith <tim.keith at gmail.com>
>Sent: Mar 29, 2009 10:40 PM
>To: coin-dev at openjdk.java.net
>Subject: Re: Proposal: Indexing access syntax for Lists and Maps
>
>Is it possible to include Set as well?
>
>E.g.  "bool = set[x]"  meaning  "bool = set.contains(x)"
>and "set[x] = bool"  meaning  "bool ? set.add(x) : set.remove(x)"
>
>-- Tim
>
>On Sun, Mar 29, 2009 at 5:12 PM, Shams Mahmood <shams.mahmood at gmail.com>wrote:
>
>> Indexing access syntax for Lists and Maps
>>
>> VERSION
>> This is version 1.0.
>>
>> AUTHOR(S):
>> Shams Mahmood Imam
>>
>> OVERVIEW
>>
>> FEATURE SUMMARY:
>> Collection classes are among the most frequently used in the Java SDK.
>> Currently Lists and Maps do not provide any additional language
>> feature to access individual elements unlike Arrays. This proposal
>> aims to provide these Collection citizens of java additional
>> language support to access elements like Arrays have currently.
>>
>> MAJOR ADVANTAGE:
>> Will provide a consistent syntax for accessing elements of Arrays,
>> Lists and Maps. In addition, the language grammar will not change
>> much since the subscript operator is already supported for Arrays.
>>
>> MAJOR BENEFIT:
>> Apart from the consistency mentioned above, implementation fo this
>> feature will result in fewer characters needed to be typed to achieve
>> simple access to elements in Maps/Lists.
>>
>> MAJOR DISADVANTAGE:
>> Like the for-each loop construct, it will expose the client to
>> NullPointerException(NPE)s when used with a null List/Map. However,
>> this shouldn't be such a major issue as NPEs are also generated
>> by arrays when the operator is used in a null array.
>>
>> ALTERNATIVES:
>> The comparatively more verbose get/set methods for Lists and get/put
>> methods for Maps.
>>
>> EXAMPLES
>>
>> SIMPLE EXAMPLE:
>>
>> public class Main {
>>  public static void main(String[] arguments) {
>>    List<String> l1 = Arrays.asList(new String[] {"a", "b", "c"});
>>    String firstElement = l1[0];
>>    Map<Integer, String> m1 = new HashMap<Integer, String>(4);
>>    m1[Integer.valueOf(1)] = "One";
>>  }
>> }
>>
>> ADVANCED EXAMPLE:
>>
>> public class Main {
>>  public static void main(String[] arguments) {
>>    List<String> l1 = Arrays.asList(new String[] {"a", "b", "c"});
>>    Map<Integer, String> m1 = new HashMap<Integer, String>(4);
>>    Map<String, Integer> m2 = new HashMap<String, Integer>(4);
>>
>>    m2[l1[2]] = m2[m1[1]] = 4; // same as m2.put(l1.get(2),
>> m2.put(m1.get(1), 4));
>>  }
>> }
>>
>> DETAILS
>>
>> SPECIFICATION:
>> Java Language Specification changes:
>>
>> 15.29 (NEW CHAPTER): Collection Access Expressions
>> A collection access expression contains two subexpressions, the List/Map
>> reference expression (before the left bracket) and the index expression
>> (within the brackets). Note that the List/Map reference expression may be a
>> name or any expression that evaluates to a List/Map. The index experssion is
>> expected to evaluate to an int for Lists and a valid key type for Maps.
>>
>> CollectionAccess:
>>  Expression [ Expression ]
>>
>> 15.8 Primary Expressions
>> original:
>> ---------
>> PrimaryNoNewArray:
>>  Literal
>>  Type . class
>>  void . class
>>  this
>>  ClassName.this
>>  ( Expression )
>>  ClassInstanceCreationExpression
>>  FieldAccess
>>  MethodInvocation
>>  ArrayAccess
>>
>> replaced with:
>> --------------
>> PrimaryNoNewArray:
>>  Literal
>>  Type . class
>>  void . class
>>  this
>>  ClassName.this
>>  ( Expression )
>>  ClassInstanceCreationExpression
>>  FieldAccess
>>  MethodInvocation
>>  ArrayAccess
>>  CollectionAccess
>>
>> 15.26 Assignment Operators
>> original:
>> ---------
>> LeftHandSide:
>>  ExpressionName
>>  FieldAccess
>>  ArrayAccess
>>
>> replaced with:
>> --------------
>> LeftHandSide:
>>  ExpressionName
>>  FieldAccess
>>  ArrayAccess
>>  CollectionAccess
>>
>>
>> COMPILATION:
>>
>> After successful creation of the AST handling the additional grammar for
>> Collection Access expressions, the syntactic sugar will be replaced by
>> JDK1.4 compatible code during the Code Generation phase. This is consistent
>> with how JDK5.0 constructs like the for-each loop is handled by the
>> compiler.
>>
>> e.g.
>> public class TestConcise {
>>  public static void main(String[] args) {
>>    java.util.Map<Integer, String> m1 = new java.util.HashMap<Integer,
>> String>();
>>    m1[2] = "two";
>>
>>    java.util.LinkedList<String> l1 = java.util.Arrays.asList( new String[]
>> {"a", "b", "c" });
>>    m1[3] = l1[2];
>>    l1[0] = m1[0];
>>    l1[1] = "one";
>>  }
>> }
>>
>> is converted to
>> public class TestConcise {
>>  public TestConcise() {
>>    super();
>>  }
>>
>>  public static void main(String[] args) {
>>    java.util.Map<Integer, String> m1 = new java.util.HashMap<Integer,
>> String>();
>>    m1.put(Integer.valueOf(2), "two");
>>
>>    java.util.LinkedList<String> l1 = java.util.Arrays.asList( new String[]
>> {"a", "b", "c" });
>>    m1.put(Integer.valueOf(3), l1.get(2));
>>    l1.set(0, m1.get(Integer.valueOf(0)));
>>    l1.set(1, "one");
>>  }
>> }
>>
>>
>> TESTING:
>>
>> LIBRARY SUPPORT:
>> No additional library support is needed.
>>
>> REFLECTIVE APIS:
>> This proposal does not require any reflective API changes.
>>
>> OTHER CHANGES:
>> No changes required.
>>
>> MIGRATION:
>> No migration is needed.
>>
>> COMPATIBILITY
>>
>> BREAKING CHANGES:
>> No breaking changes.
>>
>> EXISTING PROGRAMS:
>> Existing programs are not affected by this change.
>>
>> REFERENCES
>> My Java7 Wishlist regarding Collections,
>> http://shamsmi.blogspot.com/2008/04/my-java7-wishlist-regarding-collections.html
>> Implementation of My Java7 Wishlist,
>> http://shamsmi.blogspot.com/2008/05/implementation-of-my-java7-wishlist.html
>>
>> EXISTING BUGS:
>> None.
>>
>> URL FOR PROTOTYPE (optional):
>> Projects kijaro's concisecollections branch:
>> https://kijaro.dev.java.net/source/browse/kijaro/branches/concisecollections/
>>
>>
>>
>>
>>
>




More information about the coin-dev mailing list