import java.util.function.*;
import java.util.stream.*;
import java.util.*;
import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
/**
* Created by mcarvalho on 15-06-2015.
*/
public class App {
public static void questao1(){
Runnable r = () -> {};
Consumer<String> c1 = arg -> { System.out.println(arg); };
Consumer<String> c2 = (arg) -> System.out.println();
Consumer<String> c3 = arg -> System.out.println(arg);
IntFunction<Integer> f1 = (int i) -> i + 1;
IntConsumer f2 = (int i) -> { int n = i + 1; };
}
public static void questao2(){
BiConsumer<String, Integer> c1 = (String s, Integer b) -> System.out.println(s + ": " + b);
ObjIntConsumer<String> c2 = (String s, int b) -> System.out.println(s + ": " + b);
Predicate<String> p1 = (s) -> s.length() == 0;
Function<String, Boolean> p2 = (s) -> s.length() == 0;
BiPredicate<Integer, Integer> p3 = (a, b) -> a - b == 0;
BiFunction<Integer, Integer, Boolean> p4 = (a, b) -> a - b == 0;
}
public static Stream<Classroom> overcrowdedClass(Stream<Classroom> crs, int maxNrOfStudents) {
return crs.filter(c -> c.students.size() > maxNrOfStudents);
}
public static Classroom biggestClass(Stream<Classroom> crs) {
return crs
.max(Comparator.comparingInt(c -> c.students.size()))
.get();
/*
return crs
.sorted(Comparator.comparing(c -> c.students.size()))
.findFirst()
.get();
*/
}
public static String youngestStudent(Stream<Classroom> crs) {
Comparator<Student> youngestCmp = comparingLong(s -> s.birthTimestamp);
/*
return crs
.map(c -> c.students.stream().min(youngestCmp).get()) // -> Stream<Student>>
.min(youngestCmp)
.get()
.name;
*/
return crs
.flatMap(c -> c.students.stream()) // -> Stream<Student>
.min(youngestCmp)
.get()
.name;
}
public static Map<Integer, List<Classroom>> classesByNrOfStudents(Stream<Classroom> crs) {
return crs.collect(groupingBy(c -> c.students.size()));
}
public static Map<Integer, List<String>> classesIdByNrOfStudents(Stream<Classroom> crs) {
return crs.collect(groupingBy(
c -> c.students.size(),
mapping(c -> c.id, toList())));
}
public static Map<Integer, List<String>> studentsNameByBirthYear(Stream<Classroom> crs) {
return crs
.flatMap(c -> c.students.stream()) // -> Stream<Student>
.collect(
groupingBy(
s -> s.birthYear,
mapping(s -> s.name, toList())));
}
}
class Classroom {
public String id;
public List<Student> students;
}
class Student {
public int nr;
public String name;
public long birthTimestamp;
public int birthYear;
}