Lambda expression
Mathematically, an expression with parameter variables has been called a Lambda expression.for instance: f(x,y)=x+2y
In programming, Lambda function stands for a function defined without a name (identifier). Before Java 8, in order to pass a function, we need to declare a class that implements an interface. By this way, a developer may pass a function wrapped in an object. It is expensive in some sense.
As a known functional interface, by using the lambda expression, passing a function around can be greatly simplified.
The following example, the comparing function can be directly passed as an argument parameter. I think it exactly follows the math definition, f(x,y)=x+2y
package Lambda; import java.util.ArrayList; import java.util.List; import java.util.Collections; /** * * @author YNZ */ public class UsingLambadaExpression { public static void main(String[] args) { ListNote: You can add annotation or final modifier to the lambda parameters. Note: It is not legal for lambda to return a value in a branch. Note: Functional interface contains a single abstract method.users = new ArrayList<>(); users.add(new User("Mike")); users.add(new User("Jeppe")); users.add(new User("Yichun")); Collections.sort(users, (o1, o2) -> o1.getName().compareTo(o2.getName())); System.out.println("" + users); } } class User { private String name; public User(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return this.name; } }
Lambda Expression 3 ingredients:
(1) a block of code; (2) parameters; (3) values for the free variables, which are not defined in the block and transferred by the parameters.
a block of code and values of free values is a closure. Actually, it is implemented as a transferring by an object has a single method, so the free values have been initialized within that instance.
Method Reference
is used to simply certain Lambda expression, for instance:(x->System.out.println(x))We know there is already existed a method that may exactly operate the parameter as expected. In this case Lambda expression can be greatly simplified by using method reference.
System.out::printlnConstructor reference, it is just like method reference, but using something like Class::new. It invokes its constructor. It equivalent to the lambda expression,i.e.
x-> new constructor(x)Constructor reference can be used with the array type, i.e. int[]::new, i.e.
x-> new int[x]