import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class TangkapNilai {
    static Supplier<String> buatSapaan(String nama) {
        // parameter nama disalin ke dalam lambda saat lambda DIBUAT
        return () -> "Halo, " + nama + "!";
    }

    public static void main(String[] args) {
        // Dua lambda menangkap nilai yang berbeda
        Supplier<String> sapaBudi = buatSapaan("Budi");
        Supplier<String> sapaSiti = buatSapaan("Siti");

        // Dipanggil setelah parameter nama selesai hidup
        System.out.println(sapaBudi.get());
        System.out.println(sapaSiti.get());

        // Setiap iterasi membuat salinan tersendiri untuk lambda
        List<Supplier<Integer>> lonceng = new ArrayList<>();
        for (int i = 1; i <= 3; i++) {
            int salinan = i;   // variabel baru tiap iterasi, effectively final
            lonceng.add(() -> salinan * 10);
        }
        for (Supplier<Integer> s : lonceng) {
            System.out.println("lonceng: " + s.get());
        }
    }
}
