Lambdas are now becoming a familiar part of the Java scenery. Java 8 shipped on March 18th this year, bringing with it the long-awaited feature of lambda expressions (aka closures). Together with the associated language and library features—streams and virtual extension methods—they are having a greater impact on how we program in Java than any other change in the history of the platform.
I initially started to learn about the new features so that Phil Wadler and I could consider a second edition of our book Java Generics and Collections. But as I learned more about the subtleties of the changes, it became clear that an entire new book (Mastering Lambdas) was needed. Writing that has used up my spare cycles for nearly a year, but I’m happy now to turn my attention back to this FAQ. And though of course I’m urging you to buy the book, it’s not the end of wisdom on the subject: as I learn more and we get greater experience in using the new features, new understanding can be reflected here.
The new features weren’t all easy to understand at first, so this FAQ started with the intention of helping you over some of the obstacles that tripped me up. But then more advanced questions appeared, so I now hope that you will find it useful whether you are already familiar with lambda expressions or encountering them for the first time. All comments and contributions are welcome. I’m very pleased to acknowledge the continuing input from the Oracle Java Language and Tools team, especially Stuart Marks and Brian Goetz; their collaboration is helping to greatly improve the scope and accuracy of this document. (Of course, all errors and omissions are my responsibility.) I will be happy to include and acknowledge your contribution too. But please be aware that anything on this website may yet end up as part of the material of a new edition of Java Generics and Collections.
What’s the Purpose of this FAQ?
The question-and-answer format is intended to serve two purposes;
- It’s a tutorial: if you’re starting from scratch in learning about the upcoming changes to Java, you should be able to start with the first question, “What is a lambda expression?” and get a tutorial introduction by following the “next” link at the top right of each page;
- It’s a reference: if you want an answer to a particular technical question, jump straight to it. Since the Oracle team are also reading these answers, it’s reasonable to expect that this will become an authoritative popular reference to what’s going to happen.
- As part of the reference material, there’s a resources page, where I will maintain up-to-date links with the various rapidly-changing useful resources: documentation, presentations, build and download resources, tool support and mailing lists.
The tutorial sequence is divided into topics, to be read in the sequence listed below and in the left-hand sidebar on every page, which also corresponds to the “next” and “previous” links at the top of each post. An exception is the topic of “Design Rationale”; some questions here can also be found in the tutorial sequence, others are free-standing.
What’s Your Question?
Let me know what you think of this resource, how it could be improved, and what questions you would like to see answered here. Ask the FAQ!
1: Fundamentals of Lambda Expressions
What is a lambda expression?
Why are lambda expressions being added to Java?
What is a functional interface?
What is the type of a lambda expression?
Are lambda expressions objects?
Where can lambda expressions be used?
What are the scoping rules for lambda expressions?
Can lambda expressions be used to define recursive functions?
Can lambda expressions use variables from their environment?
What are method references?
What is the syntax for instance method references?
What are constructor references?
2: Default Methods
Questions about Design Rationale
(Questions labelled “(t)” are also included in the tutorial sequence above)
Why are lambda expressions being added to Java? (t)
Are lambda expressions objects? (t)
Why the restriction on local variable capture?
Where is the Java Collections Framework going? (t)
Why are Stream operations not defined directly on Collection?
Why are lambda expressions so-called?
Lambdas and closures—what’s the difference?
Strictly speaking, a closure is a lambda expression paired with an
environment that binds each of its free variables to a value. In Java,
lambda expressions will be implemented by means of closures, so the
two terms have come to be used interchangeably in the community.