package com.example.lambda;

/*
 * lambda expression: () -> {}
 * functional interface: interface with only one abstract method
 */

// functional interface
interface GreetingInterface {
	public void greet();
}

// concrete classes implementation
class EnglishGreeting implements GreetingInterface {
	@Override
	public void greet() {
		System.out.println("Good Morning!");
	}
}

class MalayGreeting implements GreetingInterface {
	@Override
	public void greet() {
		System.out.println("Selamat Pagi!");
	}
}

public class LambdaExample {

	public static void main(String[] args) {
		// create object EnglishGreeting
		EnglishGreeting eg = new EnglishGreeting();
		eg.greet();
		
		// create object MalayGreeting
		MalayGreeting mg = new MalayGreeting();
		mg.greet();
		
		// using polymorphism
		GreetingInterface g = new EnglishGreeting();
		g.greet();	// english
		
		// reuse the same variable to point to different implementation
		g = mg;
		g.greet();  // malay
		
		// greeting in spanish
		// this time use anonymous class
		g = new GreetingInterface() {
			
			@Override
			public void greet() {
				System.out.println("Hola!");
			}
		};
		g.greet(); // spanish
		
		// rewrite spanish implementation using lambda expression
		g = () -> System.out.println("Hola!");
		g.greet();
	}
}
