package ar.com.javacuriosities.lambdas;
/*
* Características:
* - Dentro de un lambda podemos arrojar excepciones
* - Lambdas de una línea no necesitan llaves
* - Lambdas de una línea no necesitan un return
* - Lambdas de un solo parámetro no necesitan paréntesis
* - Lambdas sin parámetros debe contener paréntesis vacíos
*
* () -> System.out.println("Hello World")
* x -> x + 10
* (int x, int y) -> { return x + y; }
* (String x, String y) -> x.length() - y.length()
* (int x) -> {
* int y = 10;
* return x + y;
* }
*
* Una Lambda Expression puede ser usada donde el tipo es una Functional Interface
*
* Functional Interface (ASM --> Abstract Single Method)
* - Tiene que ser una interfaz
* - Es una interfaz con un solo método abstracto
* - El Lambda es provisto como implementación del método abstracto
* - Esta puede estar anotada con la annotation @FunctionalInterface la cual le dice al compilar que validé que esa interfaz es valida como Functional Interface
*/
public class Lesson02Features {
public static void main(String[] args) {
/*
* Aca estamos usando nuestra propia Functional Interface pero muchas interfaces del
* JDK cumplen con esto contrato así como muchas otras fueron agregadas
*/
MyOwnFunctionalInterface methodImplementation = () -> System.out.println("Hello World");
methodImplementation.execute();
methodImplementation.defaultBehaviour();
MyOwnFunctionalInterface.staticBehaviour();
}
@FunctionalInterface
private interface MyOwnFunctionalInterface {
public void execute();
/*
* Hasta Java 1.7 las interfaces solo podan tener métodos abstractos y atributos estáticos,
* pero esto cambio a partir de Java 1.8 donde puede tener métodos marcados como default (Esto
* fue agregado para no romper implementaciones existentes)
*/
default public void defaultBehaviour() {
System.out.println("This method is inherited for all classes which implements this interface");
}
public static void staticBehaviour() {
System.out.println("Now interfaces can have static methods");
}
}
}