Review Request: CR#8001634 : Initial set of lambda functional interfaces

Remi Forax forax at univ-mlv.fr
Sat Nov 3 11:19:39 PDT 2012


On 11/03/2012 07:03 PM, Joe Bowbeer wrote:
> By the way, don't the method names matter?  If so, shouldn't naming 
> proposals include the corresponding method names?

yes, it's a good idea.

>
> I assume the following are correct:
>
> Operator::operate
> Predicate::test
> Procedure::apply

Procedure::proceed

> Supplier::supply
>
> But what does a Function do?  (What method corresponds to Function?)
>
> Function::fun ?

Function::apply

>
> --Joe

Rémi

>
> On Sat, Nov 3, 2012 at 10:39 AM, Joe Bowbeer wrote:
>
>     Comments on Brian's update and later comments related to it:
>
>     1. I like Supplier (or Locator?) better than Factory.  Both are
>     compatible with reuse.
>
>     But what is the method called?  Doesn't 'make' have the same
>     problem as Factory?  If the method remains 'make' then why not
>     call the class "Maker"?
>
>     2. I'm OK with Function, Predicate, Procedure
>
>     Procedure must have void return
>
>
>
>     On Fri, Nov 2, 2012 at 12:32 PM, Brian Goetz wrote:
>
>         Gathering the feedback we've gotten so far:
>
>         1.  Factory.  People seem comfortable renaming Factory to
>         Supplier; as a bonus (or not), IntSupplier specializations
>         make more sense when connected to Supplier than Factory (how
>         do you make new ints?)
>
>         2.  Mapper.  I agree with Doug's complaint that Mapper is too
>         specialized, especially as it is probably the most useful
>         shape of function and will be used in places that have nothing
>         to do with mapping.  While I've resisted "Function" for a long
>         time (and will continue to resist Function1..FunctionN), its
>         not clear that there are significantly better alternatives.
>
>         2a.  IMO Fun or Func are *not* better alternatives.  The extra
>         few characters are not an impediment, and would be
>         inconsistent with the other naming conventions we're adding here.
>
>         2b.  The reason I've resisted Function* is that is kind of
>         gives up one of the few benefits of nominal function types.
>          Structural function types are clearly "better", except that
>         erased structural function types are clearly awful.  So
>         nominal function types are the best we can do here.  Nominal
>         function types have two advantages to offset their many
>         disadvantages:
>          - Type names are useful and informative, especially in API
>         signatures
>          - The libraries are already full of nominal function types
>         like Runnable and Comparator, so adding more does not create a
>         bifurcation between "old libraries" and "new libraries".
>
>         Going full-hog to Function1..FunctionN (for an ever-increasing
>         N) basically says "let's take all the disadvantages of nominal
>         types, and none of the advantages."  API signatures that have
>         nothing but Function1 and Function2 in them are unlikely to be
>         very informative.
>
>         Guava managed to get away with only Function and a few other
>         SAMs, and not need to go much further, so it is a possible
>         candidate for recasting Mapper, though I still don't like the
>         slippery slope.  Would like something better, but Mapper
>         probably isn't it.
>
>
>         So if we adopt the above we'd have:
>
>         {Int,Long,Double}?Predicate:      T -> boolean
>         {Int,Long,Double}?Function:       T -> U
>         {Int,Long,Double}?Block:          T -> void
>         {Int,Long,Double}?UnaryOperator:  T -> T
>         {Int,Long,Double}?Supplier:       () -> T
>         {Int,Long,Double}?{Binary,Unary}Operator
>
>
>         As to the arity modifiers (which will come in the next round),
>         it seems likely we'll want the equivalent of
>
>         Bi{Predicate,Function,Block}
>
>         Does the Bi/Tri convention scale sufficiently?  Is the
>         "inconsistency" (which I don't really think is an
>         inconsistency) with BinaryOperator excessively bothersome?
>
>
>
>         On 10/31/2012 4:16 PM, Mike Duigou wrote:
>
>             There's a large set of library changes that will be coming
>             with Lambda. We're getting near the end of the runway and
>             there's lots left to do so we want to start the process of
>             getting some of the more stable pieces put back to the
>             JDK8 repositories.  We've spent a some time slicing things
>             into manageable chunks. This is the first bunch. We'd like
>             to time-box this review at one week (until Nov. 7th),
>             since there are many more pieces to follow.
>
>             The first chunk is the basic set of functional interface
>             types.  While this set is not complete, it is enough to be
>             able to proceed on some other pieces.  This set contains
>             no extension methods (we'll do those separately) and does
>             not contain all the specializations we may eventually need.
>
>             Doug has also suggested we have some sort of regularized,
>             low-level naming scheme.  There's nothing in this bunch
>             that is inconsistent with that; if we had such a thing,
>             the nominal SAMs here could easily implement the horribly
>             named low-level versions.  We're still thinking about how
>             that might fit in, so while that's not directly reflected
>             here, it hasn't been forgotten.
>
>             The specification is limited; most of the interesting
>             restrictions (side-effect-freedom, idempotency, stability)
>             would really be imposed not by the SAM itself by by how
>             the SAM is used in a calculation. However, some common doc
>             for "how to write good SAMs" that we can stick in the
>             package doc would be helpful. Suggestions welcome.
>
>             Elements of this naming scheme include:
>             - Each SAM type has a unique (arity, method name) pair.
>              This allows SAMs to implement other SAMs without collision.
>             - The argument lists are structured so that
>             specializations act on the first argument(s), so
>             IntMapper<T> is a specialization of Mapper<R,T>, and
>             IntBinaryOperator is a specialization of BinaryOperator<T>.
>             - Multi-arg versions use prefix BiXxx, TriXxx, as
>             suggested by Doug. However, the "natural" arity varies.
>              No good two or three letter prefix for zero or one comes
>             to mind (e.g., UnaryFactory<T> or NilaryBlock (though
>             that's the same as Runnable.)  So that could be improved.
>
>             Please review and comment.
>
>             http://cr.openjdk.java.net/~mduigou/8001634/2/webrev/
>             <http://cr.openjdk.java.net/%7Emduigou/8001634/2/webrev/>
>
>
>



More information about the lambda-libs-spec-observers mailing list