• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Sybex CSG 17 - Chapter 8 - Page 450 - Summary possible errata

 
Greenhorn
Posts: 16
1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
The summary gives the full syntax of a lambda expression as:


It then goes on to describe the syntax of the short form and gives the lambda as:


While this could be valid assuming b is defined in an instance variable, static variable, local variable, or method parameter (for local variable and method parameter, only if final or effectively final) in code that is omitted, it seems more logical to think the authors intended to show the abbreviated form of the previous full syntax. That is:

 
Marshal
Posts: 79412
377
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
In the second case, it is likely that b is a variable declared outwith the λ, and yes, a parameter or local variable does have to be effectively final, but maybe that is what the authors intended. We might be more confident with a bit more context please.
Many people believe there should be no such thing as a static variable, using static fields only for constants.
 
Tim Mousaw
Greenhorn
Posts: 16
1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
The relevant paragraphs are as follows:

Lambda expressions, or lambdas, allow passing around blocks of code. The full syntax look like this:


The parameter types can be omitted. When only one parameter is specified without a type, the parentheses can also be omitted. The braces and return statement can be omitted for a single statement making the short form as follows:


While I understand this shows the most abbreviated form, it begs the question of where b comes from. And using the same body as the full syntax may lead to one believing the latter is intended to be the short form of the former. It may be more straightforward to use a different body (e.g. a -> a.toUpperCase())

 
Master Rancher
Posts: 4908
74
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I agree, Tim.  It seems that by trying to re-use similar code, they've created a more confusing situation that doesn't quite fit.  There's also more than just one "long form" and one "short form" - e.g. these are also possible, and equivalent to the first version:



For a one-argument version, perhaps it would be easier to just replace b with a literal of some sort, and skip the "where did b come from?" confusion:
 
Bartender
Posts: 5471
212
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
@Tim
just a petite practice-question:
can you replace:

by

?
 
Tim Mousaw
Greenhorn
Posts: 16
1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
@Piet
Yes, that's perfectly legal. You're taking an instance of a String and calling the equals method on it with a method reference. If used in a stream method like filter assuming strings in a collection it would filter for all Strings that were Yes (case sensitive, or else you should have used "Yes"::equalsIgnoreCase).
 
Campbell Ritchie
Marshal
Posts: 79412
377
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Beware: tangent!

Why might Piet's method reference be better than Mike's? Apart from being shorter, that is.
 
Piet Souris
Bartender
Posts: 5471
212
  • Likes 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
@Tim
Indeed. What I wanted to bring into memory (always handy for the OCPJP) is that

stands for

Here we had

and if that method is commutative, which the equals-method should be (but there is an exception, see Campbells reply), then that is equivalent to

or

 
Tell me how it all turns out. Here is a tiny ad:
a bit of art, as a gift, the permaculture playing cards
https://gardener-gift.com
reply
    Bookmark Topic Watch Topic
  • New Topic