"it"? "#"? ""?
John Nilsson
john at milsson.nu
Sat Nov 19 12:10:06 PST 2011
Given that the usecase for this is about implicit context i really like the
last option of just leaving the space before the period unfilled.
Similarly it would be nice if it worked for all operators: list.filter(>2)
BR,
John million
Den 19 nov 2011 00:51 skrev "Matthew Adams" <matthew at matthewadams.me>:
> NB: I'm searching through the archives on this and didn't see anything
> that directly addressed it.
>
> I just got through the slides at
> http://blogs.oracle.com/briangoetz/entry/slides_from_devoxx_talk_on
> and noticed a nice feature inspired by Groovy that was missing from the
> slide code examples. I don't know if it's missing from the lambda
> proposal, though -- I can't tell from the slides.
>
> Groovy defaults the name of a single closure argument to "it". I think
> this would be nice to have in JDK8 lambdas, too.
>
> =====
> // Without "it":
> void expire(File root, long before) {
> ...
> root.listFiles(File p -> p.lastModified() <= before);
> ...
> }
> =====
> // With "it":
> void expire(File root, long before) {
> ...
> root.listFiles(it.lastModified() <= before);
> ...
> }
> ======
>
> Is this possible to include, or will the grammar require "->" so that
> "it.lastModified <= before" isn't interpreted by the compiler as a boolean
> expression? If that's the case, how about considering "#" (or some other
> appropriate character) instead of "it"? That way, the compiler would know
> implicitly that if it encounters a "#", it *must* be a lambda expression
> taking a single variable of an inferred type:
>
> =====
> // With "#":
> void expire(File root, long before) {
> ...
> root.listFiles(#.lastModified() <= before);
> ...
> }
> ======
>
> You could even reduce "it" or "#" to an empty string and just use the "."
> with no preceding scope. I don't know if the grammar could support it, but
> it's interesting. I'm not sure I like it, but is sure is compact!
>
> =====
> // With "":
> void expire(File root, long before) {
> ...
> root.listFiles(.lastModified() <= before);
> ...
> }
> ======
>
> Another example:
> =====
> // explicit lambda param name
> Set<Album> favs = albums
> .filter(a -> a.tracks.anyMatch(t -> (t.rating >= 4)))
> .into(new HashSet<>());
> =====
> // "it"
> Set<Album> favs = albums
> .filter(it.tracks.anyMatch(it.rating >= 4)) // 2 its!?!?
> .into(new HashSet<>());
> =====
> // "#"
> Set<Album> favs = albums
> .filter(#.tracks.anyMatch(#.rating >= 4))
> .into(new HashSet<>());
> =====
> // ""
> Set<Album> favs = albums
> .filter(.tracks.anyMatch(.rating >= 4))
> .into(new HashSet<>());
> =====
>
> Thoughts?
>
> -matthew
>
> --
> @matthewadams12
> mailto:matthew at matthewadams.me
> skype:matthewadams12
> yahoo:matthewadams
> aol:matthewadams12
> google-talk:matthewadams12 at gmail.com
> msn:matthew at matthewadams.me
> http://matthewadams.me
> http://www.linkedin.com/in/matthewadams
>
>
More information about the lambda-dev
mailing list