package fr.yunes;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/*
class Code implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("coucou");
    }
}
*/
// Exemple d'interface fonctionnelle
// Une interface fonctionnelle c'est une interface avec une et une seule m├ęthode abstraite
@FunctionalInterface
interface MonInterface {
    public void f();
}

public class Main {
    public static void main(String[] args) {
        JFrame f = new JFrame("test");
        JButton b = new JButton("clic");
        f.getContentPane().add(b);
        f.pack();
        f.setVisible(true);

//        Code a = new Code();
//        b.addActionListener(a);
        b.addActionListener(
                e -> {
                    System.out.println("coucou");
                    System.out.println("cuicui");
                }
        );
/* Autre exemple d'utilisation des interfaces fonctionnelles
        Thread t = new Thread(
                ()->{
                    for (int i=0; i<10; i++)
                        System.out.println(i);
                });
        t.start();

 */

        List<Integer> l = new LinkedList<Integer>();
        l.add(5); l.add(10); l.add(56); l.add(666); l.add(667);

        for (int v : l ) {
            System.out.println(v);
        }
        A object = new A();
        l.forEach(object::f);
        l.forEach(A::statf);

        int resultat = l.stream()
                .filter(i->i%2==0)
                .map(Math::sin)
                .filter(d->d>0.5)
                .map(d->(int)(d*20))
                .reduce(0,Integer::sum);
        System.out.println(resultat);

        Map<Boolean,List<Integer>> r = l.stream()
                .collect(Collectors.partitioningBy(i->i%2==0));
        System.out.println(r);
        Map<Integer,List<Integer>> r2 = l.stream()
                .collect(Collectors.groupingBy(i->i%3));
        System.out.println(r2);
    }
}

class A {
    public static void statf(Integer i) {}
    public void f(Integer i) {
        System.out.println("valeur="+i);
    }
}