package com.lokesh.lambda;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public abstract class Example_Consumer {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Bruce", "Logan", "Peter");

        System.out.println("Using anonymous class");
        names.forEach(new Consumer<String>() {
            @Override
            public void accept(String name) {
                System.out.println(name);
            }
        });

        System.out.println("\nUsing lambda expression");
        names.forEach(name -> System.out.println(name));

        System.out.println("\nUsing method reference (will create a class on the fly)");
        Consumer<String> myConsumer = System.out::println;
        names.forEach(System.out::println);

        System.out.println("\nUsing stream to map to another class");
        names.stream().map(Hero::new)
                .map(Hero::getSecretIdentity)
                .forEach(myConsumer);

    }

    public abstract void accept(String name);
}

class Hero {
    private String secretIdentity;

    public Hero(String secretIdentity) {
        this.secretIdentity = "Mr. " + secretIdentity;
    }

    public String getSecretIdentity() {
        return secretIdentity;
    }
}