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

Tim Peierls tim at peierls.net
Sat Nov 3 11:54:11 PDT 2012


I've found it very convenient, in my experiences with Guava, to have all of
these methods named apply. I use a text editor with no IDE help, so it's
nice to have to remember only one method name.

And Supplier.get works well for a similar reason: I use Guava Supplier and
Optional, javax.inject.Provider, j.u.c.Future, etc. and I find it
convenient to be able to type get() for all of them. (Still have to
remember that Future.get throws Exception, though.)

I'm in favor of naming schemes with a small brain footprint.

--tim

On Sat, Nov 3, 2012 at 2:42 PM, Joe Bowbeer <joe.bowbeer at gmail.com> wrote:

> I like Function::apply
>
> Here are alternatives for Procedure
>
> Procedure::do
> Procedure::perform
>
>
> On Sat, Nov 3, 2012 at 11:19 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>
>> 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/~mduigou/8001634/2/webrev/>
>>>             <http://cr.openjdk.java.net/%**7Emduigou/8001634/2/webrev/<http://cr.openjdk.java.net/%7Emduigou/8001634/2/webrev/>
>>> >
>>>
>>>
>>>
>>>
>>
>


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