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) {
List 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;
}
}
Note: 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.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]