Las expresiones lambda son una forma de crear funciones anónimas y que puedes utilzar en dónde el párametro recibido sea una interfaz funcional
Una expresión lambda tiene esta forma
(parameters) -> expression
(parameters) -> { statements; }
Estas son algunas expresiones lambda de ejemplo:
- () -> 5 // directamente devuelve un valor, return 5
- x -> 2 * x // duplica el valor de x y lo retorna
- (x, y) -> x – y // toma dos valores y retorna su diferencia, aqui se infiere el tipo int
- (int x, int y) -> x + y // toma dos enteros y retorna su suma
- (String s) -> System.out.print(s) // toma un string y lo imprime en la consola
Observa lo siguiente:
-Si se tiene un solo parámetro no es obligatorio usar los paréntesis
x -> 2 * x
-Si no se tienen parámetros o si hay dos o más parámetros debemos usar paréntesis
() -> 5
(x, y) -> x – y
-Si la expresión lambda es de una línea no se requieren llaves ni return.
(String s) -> System.out.print(s)
Expresiones lambda e Interfaces funcionales
Repasando lo dicho, las expresiones lambda son funciones anónimas que puedes utilizarlas en donde el parámetro sea una interfaz funcional.
Por ejemplo, la interface Comparator es una interfaz funcional en el que usas su método abstracto ‘compare’ con expresiones lambda.
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
Puedes entonces crear un comparator utilizando una lambda expresión con esta interfaz funcional de este modo.
// JAVA 8 with lambda
Comparator<UserModel> userModelComparator = (UserModel u1, UserModel u2) -> u1.getPosition().compareTo(u2.getPosition());
// JAVA 7 lo harias de este modo
Comparator<UserModel> userModelComparator = new Comparator<UserModel>() {
@Override
public int compare(UserModel u1, UserModel u2) {
return u1.getPosition().compareTo(u2.getPosition());
}
};
Algunos ejemplos de uso de lambdas
Prueba estos ejemplos simples en tu IDE para comprender mejor el uso de lambdas y cómo puedes simplicar significativamente tu código
public class LambdaExample {
public static void main(String[] args) {
List<UserModel> userModels = getUsers();
// JAVA 8 sort list using lambda
userModels.sort((UserModel u1, UserModel u2)-> u1.getPosition().compareTo(u2.getPosition()));
// JAVA 8 Foreach using lambda
userModels.forEach((userModel)->System.out.println(userModel));
// JAVA 8 Foreach using lambda and reference method
userModels.forEach(System.out::println);
// JAVA 8 Foreach using lambda with sentences
userModels.forEach(user->{
if("Gustavo".equals(user.getName())){
System.out.println("Hi Gustavo!");
}else{
System.out.println(user.getName());
}
});
// JAVA 8 Simple Runnable using lambda
new Thread(() -> System.out.println("Hi thread")).start();
// JAVA 8 Runnable using lambda
Runnable task = () -> {
userModels.forEach(user->{
System.out.println( "Hi " + user.getName() );
});
};
// start the thread
new Thread(task).start();
}
static class UserModel {
String name;
String position;
public UserModel(String name, String position) {
this.name = name;
this.position = position;
}
public String getName() {return name;}
public String getPosition() {
return position;
}
}
static List<UserModel> getUsers() {
List<UserModel> userModels = new ArrayList<>();
userModels.add(new UserModel("Gus","A"));
userModels.add(new UserModel("Harrison","Z"));
userModels.add(new UserModel("James","G"));
//.. more..
return userModels;
}
}
…