hg: lambda/collections/jdk: 2 new changesets

Brian Goetz brian.goetz at oracle.com
Wed Feb 23 08:49:56 PST 2011


Yes, that's right.  I see several sensible categories here:
  - Serial/Eager -- operations on collections that eagerly produce new 
collections (a few of which were implemented here)
  - Serial/Lazy -- stream-like operations on collections that can be 
easily pipelined, and then converted to / dumped into collections at the 
tail end of the pipeline
  - Parallel/Lazy -- operations on collections that can be parallelized 
(e.g., filter/map/reduce) and possibly jammed so that a pipeline of 
parallel operations (filter/map/reduce) can be combined into a single 
compound operation that executes in a single parallel pass (a la 
ParallelArray)

The JSR 166 Expert Group (the friendly folks who brought you 
ThreadPoolExecutor and ConcurrentHashMap!) will be developing these APIs.

On 2/23/2011 11:11 AM, Paul Benedict wrote:
> The name of SerialEagerCollections is reminiscent of the eager/greedy,
> reluctant, and possessive qualifiers in regex -- different algorithms,
> in essence. I assumed other algorithms would be following.
>
> On Wed, Feb 23, 2011 at 9:55 AM, Brian Goetz <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
>     You beat me to the part where I explain what these changes actually are
>     supposed to be.  What you're seeing is the first end-to-end
>     demonstrations of extension methods in action!
>
>     For the time being, this repository (lambda-collections) is completely
>     experimental.  Do not take anything that happens here as an indication
>     of what the APIs (or implementations) are going to look like.  (This is
>     the downside of working in the open; everything that gets checked in is
>     assumed to be perfect and final; things in this repo are neither and
>     won't be for a long time.)
>
>     Rather than start with the hard part (parallel/lazy aggregate
>     operations), this changeset demonstrates the simplest serial/eager
>     collection->collection operations, which is the least interesting (and
>     least efficient) corner of the lambda-enabled collections strategy.
>
>     The interesting takeaway here is that there is a simple set of JUnit
>     test cases that compile with the lambda-enabled compiler and run using
>     the bytecode weaver tool that Robert Field has been working on.  This
>     represents the first end-to-end demonstration of extension methods
>     working in the compiler, libraries, and VM (though the VM is being faked
>     out by a build-time weaving tool, which is just an intermediate step,
>     useful for refining the defender resolution algorithms before we start
>     hacking the VM.)
>
>
>     I'll address your entirely valid API design suggestions separately (but
>     probably not for a while.)
>
>
>     On 2/23/2011 8:15 AM, Thomas Münz, XDEV Software Corp. wrote:
>      > If I may:
>      > I browsed the source code a little because I'm very interested in
>     how the JDK collections will get enhanced for functional
>     programming, internal iteration, etc.
>      > Background is: I wrote my own collections framework to replace
>     the JDK collections (for many reasons of dissatisfaction with what's
>     there, but that's not the issue here, of course)
>      >
>      > I came accross the new Collection method
>      > Collection<E>  filter(Predicate<? super E>  filter)
>      >
>      > and it's defender delegate in SerialEagerCollections:
>      >
>      > public static<E>  Collection<E>  filter(Collection<E>
>       collection, Predicate<? super E>  predicate) {
>      > return filterTo(collection, new ArrayList<E>(), predicate);
>      > }
>      >
>      > and then accross the comment:
>      > // Much work remains in the area of choosing the correct type of
>     collection to construct.
>      >
>      >
>      > I had the exact same problem when designing the "XCollection"
>     interfaces. I started out with the same "filter(Predicate<? super E>
>       filter)" and ended with a very unsatisfying "new ArrayList<E>()"
>     as an implementation detail.
>      > To cut a long story short: as fancy as ".filter()" might look, it
>     turned out that it is too concrete and the following is much more
>     convenient and flexible in practice (seperating concearns more clearly):
>      >
>      > public<C extends Collecting<? super E>>  C copyTo(C target,
>     Predicate<? super E>  predicate);
>      >
>      > (Collecting<E>  is a simple interface reabstracting the boolean
>     add(E element) method to provide more flexibility for my SQL-like
>     Collection-querying framework. For JDK collections, one could put
>     Collection<? super E>  there as well, of course)
>      > This way, the very same method can do the following things:
>      >
>      > final ArrayList<Person>  newPersonList = persons.copyTo(new
>     ArrayList<Person>(), myPredicate);
>      >
>      > final HashSet<Person>  newPersonSet = persons.copyTo(new
>     HashSet<Person>(), myPredicate);
>      >
>      > persons.copyTo(alreadyExistingTargetCollection, myPredicate)
>      >
>      > myCollectionFactory.toNewInstance(persons, myPredicate)
>      >
>      >
>     this.doSomethingElseWith(persons.copyTo(alreadyExistingTargetCollection,
>     myPredicate));
>      >
>      > etc. ...
>      >
>      > In the end, I found that it's almost never desireable to have a
>     (general purpose) collection implementation decide on its own which
>     type of collection one has to use in the application code. The
>     filter(predicate) variant would be just another method next to
>     copyTo(target, predicate) to bloat method count but be of very
>     little use (or even dangerous and thus adverse, given that the
>     implementation-decided collection type might change silently)
>     compared to it.
>      >
>      >
>      > Don't know if it's bumptious (<- funny word from the translator
>     website) to tell the "pros" how to design their interfaces ;), but
>     back then it turned out to be cleaner architecture that way for me
>     (although losing the fancy "filter()"-like looks :) ), so I just
>     thought throwing it in might help.
>      > There'd be similar findings regarding collections in general and
>     their enhancement towards functional programming, performance,
>     functionality, etc., but I guess I'd make myself pretty obnoxious
>     pretty quick once getting started :-D (and it'd be off-topic here as
>     well).
>      >
>      >
>      > Regards,
>      > Thomas
>      >
>      >
>      >
>      > Subject: hg: lambda/collections/jdk: 2 new changesets (Tue Feb 22
>     16:01:45 PST 2011)
>      > From: brian.goetz at oracle.com <http://oracle.com> brian.goetz
>     at oracle.com <http://oracle.com>
>      >
>      >> Changeset: 63693b18adef
>      >> Author:    briangoetz
>      >> Date:      2011-02-22 19:00 -0500
>      >> URL:>
>     http://hg.openjdk.java.net/lambda/collections/jdk/rev/63693b18adef
>      >>
>      >> Add SAM types Block,Predicate,Reducer,Mapper; add simple
>     forEach/filter/map/reduce methods to Collection,List,Set with simple
>     serial/eager implementations; add simple test suite (1 suppressed
>     failure)
>      >>
>      >> + defender-tests/build.xml
>      >> + defender-tests/src/SerialEagerCollectionsTest.java
>      >> ! make/common/shared/Defs-java.gmk
>      >> ! make/java/java/FILES_java.gmk
>      >> ! src/share/classes/java/util/Collection.java
>      >> ! src/share/classes/java/util/List.java
>      >> + src/share/classes/java/util/SerialEagerCollections.java
>      >> ! src/share/classes/java/util/Set.java
>      >> + src/share/classes/java/util/sam/Block.java
>      >> + src/share/classes/java/util/sam/Mapper.java
>      >> + src/share/classes/java/util/sam/Predicate.java
>      >> + src/share/classes/java/util/sam/Reducer.java
>      >>
>      >> Changeset: f6dceeefc7c4
>      >> Author:    briangoetz
>      >> Date:      2011-02-22 19:01 -0500
>      >> URL:
>     http://hg.openjdk.java.net/lambda/collections/jdk/rev/f6dceeefc7c4
>      >>
>      >> Merge
>      >
>      >
>      >
>
>


More information about the lambda-dev mailing list