import java.util.List;
import java.util.ArrayList;
import java.util.function.Predicate;
import java.util.function.Function;
import java.util.stream.*;


public class TestLambda {
	public static void main(String[] arg) {
	   List<Etudiant>	el = new ArrayList<Etudiant>();
	   el.add(new Etudiant(18,"DURANT","Pierre")) ;
	   el.add(new Etudiant(12,"DUPONT","Pierre")) ;
	   el.add(new Etudiant(25,"MARTIN","Jacques")) ;
	   el.add(new Etudiant(22,"NGUYEN","Jean")) ;
	   System.out.println(el);
	   TestLambda tl = new TestLambda();

	   Predicate<Etudiant> estJeune = 
	     (et) -> ((et.getAge() >= 16) && (et.getAge() <= 23)) ;
	   List<Etudiant> el2 = tl.filter(el,estJeune) ;
	   System.out.println(el2) ;
	   
	   Function<Etudiant,Etudiant> incr = 
	      (et) -> new Etudiant(et.getAge()+2, et.getNom(), 
	    		               et.getPrenom());
	      
	   List<Etudiant> el3 = tl.map(el2, incr);
	   System.out.println(el3);
	   
	   String s = el . stream()
			.parallel() 
   			.filter(estJeune)
   			.map(p -> p.getNom())
   			.filter(n -> !(n.equals("")))
   			.reduce("--", (res,n) -> res + "," + n) ; 
	   
	   System.out.println(s);
	}
	public  <T> List<T>  filter(List<T> l, Predicate<T> pred) {
		List<T> r = new ArrayList<T>();
		for (T elt : l)  {
			if (pred.test(elt))  {
				r.add(elt);
			}
		}
		return r ; 
	}

	public <S,T> List<T> map(List<S> l, Function<S,T> f) {
		List<T> r = new ArrayList<T>();
		for (S elt : l)  {
				r.add(f.apply(elt));
		}
		return r ; 
	}
	
  
}
