London Lambdas Hackday: Existing Code

Howard Lovatt howard.lovatt at gmail.com
Tue Jul 3 22:41:59 PDT 2012


Re Scoping.

I too find the conversion from inner clases to lambdas and vice versa error
prone.

Since ifs and fors are likely to be less common once a lambdafied
collection library is available, particularly in parallel form, the
'desire' to be like a if/for block is reduced and the 'desire' to be like a
class increased.

On 4 July 2012 01:28, Brian Goetz <brian.goetz at oracle.com> wrote:

> > One of the projects we tried to lambda-ize was vert.x.  This is
> > essentially an asynchronous eventing system (similar to node.js) on
> > the JVM.  This was a big success in the sense that because everything
> > was based upon callbacks to a handler interface, it was incredibly
> > straightforward to lambda-ize and it made code both easier to read and
> > shorter.  Unfortunately it was really too easy - we didn't really
> > learn that much from this exercise.
>
> Well, we learned one thing -- that easy examples just work.  That's
> something.
>
> > My only comment building on this is that variable scoping makes
> > converting anonymous inner classes more difficult than absolutely
> > necessary. The context to this was a programmer converting anonymous
> > inner classes in some existing code to lambdas in order to remove
> > boilerplate.  Due to the fact that the inner function had a variable
> > with the same name as a variable that had been defined in the outer
> > method, he received a “error: variable num is already defined in
> > method” message.
>
> This is one of those things that is still under discussion.  The "no
> shadowing" rule comes from a motivation that lambdas are more like
> ordinary blocks of code (like the body of an 'if') than like inner
> classes, and shadowing is prohibited in those contexts.  But we're not
> sure if this helps or hurts.
>
> > This example spurned some interesting discussion:
> >
> > 1. Guava’s predicates vs Java 8 Predicates
> >
> > People using Guava's predicate library already will have an interface
> > doing something identical to the Java 8 Predicate.  Furthermore they
> > will be able to
>
> to?
>
> > 3. Method References
> >
> > If you heavily use guava's FP constructs then there's an expectation
> > of needing some kind of Function<Foo,Bar>.  In other words if you're
> > using a method reference SomeClass::someMethod, then you expect
> > someMethod to be of type, "Function<Foo,Bar> someMethod()" rather than
> > "Foo someMethod(Bar bar)".  From talking to people, it actually seems
> > like method references are more natural if they're not coming from a
> > guava background.  This isn't just guava - there are several libraries
> > offering a limited range of FP Oriented facilities.  Not sure what can
> > be done about this, but perhaps this is another thing that could be
> > helped with documentation and examples, rather than needing a
> > language/API change.
>
> Absolutely.  Method references are the hidden gem of this whole
> exercise, but will take some time (and IDE help!) for people to realize
> their effectiveness.
>
> > On a related note, it was initially hard to understand where you got a
> > method reference from.  I suspect that this is something that
> > programmers need to just develop a sense for, but there certainly was
> > confusion about static and instance method references.  Some people
> > tried to use SomeClass::someMethod instead of someInstance::someMethod
> > when getting obtaining references.  At a conceptual level it seems
> > obvious if you're referring to an instance method it needs to be
> > associated with some instance, but there is something confusing about
> > this.
>
> Actually, its more complicated than that.  You can take a method
> reference to an instance method in two ways, bound and unbound.  Both
> are useful; I think the unbound form is probably more useful.  For class
> C, if you have an instance method foo of type T->U, then
>
>    C::foo
>
> is of type (C, T) -> U and
>
>    instanceOfC::foo
>
> is of type T -> U.
>
> The unbound form shows up in "map" a lot:
>
>        people.filter(Person::isTall)
>              .map(Person::getHeight)
>              .into(tallPeopleHeights);
>
> Here, the instance is provided by the stream.
>
> > 4. Factory naming conventions don't make sense anymore
> >
> > If you care about API Fluency then you might frequently have factory
> > methods that are named in that style, for example:
> >
> > LocalDate eventDate = LocalDate.from(eventTimestamp)
> >
> > And "LocalDate from eventTimestamp" reads like an English sentence.
> > However when you start to use a factory method as a method reference,
> > the naming convention is totally lost.
>
> Good point.  In this case, maybe better to just use a lambda for
> readability:
>
>    timestamps.map(t -> LocalDate.from(t))
>              .into(...)
>
>
>


-- 
  -- Howard.


More information about the lambda-dev mailing list