Créer un projet maven et récupérer le pom.xml de ce repo Github.
- groupId: xke-fp
- artifactId: xke-fp
- version: 1.0
La doc de Guava est ici : http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/
Pour les assertions, Fest-assert est utilisé : http://docs.codehaus.org/display/FEST/Fluent+Assertions+Module L'utilisation optimale de cette API nécessite d'intégrer l'import static suivant :
import static org.fest.assertions.Assertions.assertThat;
La présentation est disponible à l'adresse : https://docs.google.com/presentation/d/19iWQ4d_05Ahsc24p3JgpFoKalUbt-RNK3XQMv0ZdEUA/edit
Programmer une version de la fonction factorielle.
// test unitaire
fact(0) = 1
fact(1) = 1
fact(5) = 120
fact(10) = 3628800
Réaliser cette exercice en Java seulement puis en utilisant l'interface Function de Guava, dans sa forme récursive simple puis dans sa forme récursive terminale.
On fournit une liste de salaires. Ecrire la méthode HandsOn.lessThan() qui ne conserver
les salaires inférieurs strictement à 3000 en utilisant Iterables.filter().
// test unitaire
Iterable<Double> salaries = Arrays.asList(1000.0, 2000.0, 2500.0, 3000.0, 4000.0);
Iterable<Double> newSalaries = HandsOn.lessThan(3000.0, salaries);
assertThat(newSalaries).containsOnly(1000.0, 2000.0, 2500.0);
On fournit une liste de salaires.
Ecrire la méthode HandsOn.increaseSalaries() qui applique une augmentation identique à
une liste de salaires en utilisant Iterables.transform() (équivalent de map en Guava).
// test unitaire
Iterable<Double> salaries = Arrays.asList(1000.0, 2000.0, 2500.0, 3000.0, 4000.0);
Iterable<Double> newSalaries = HandsOn.increaseSalaries(salaries, 0.02);
assertThat(newSalaries).containsOnly(1020.0, 2040.0, 2550.0, 3060.0, 4080.0);
La fonction fold(list, init, function) n'existe pas en Guava. Ecrire la fonction fold() et utiliser cette
fonction pour calculer une somme de nombres.
// signature
// <T, R> R fold(Iterable<T> values, R init, Function<R, Function<T, R>> function)
// test unitaire
List<Integer> values = Arrays.asList(1, 2, 3);
Integer result = HandsOn.fold(values, 0, sum);
assertThat(result).isEqualTo(6);
Écrire la fonction HandsOn.zipWith(function, list1, list2) qui fusionne deux listes en se
basant sur une fonction.
// signature
// <T1, T2, R> Iterable<R> zipWith(Function<T1, Function<T2, R>> function, Iterable<T1> list1, Iterable<T2> list2)
// test unitaire
Iterable<Integer> result = zipWith(sum, Arrays.asList(1, 2), Arrays.asList(3, 4, 6));
assertThat(result).containsExactly(4, 6);
Écrire la méthode HandsOn.enumPositiveInts() qui retourne un Iterable<Integer> contenant
tous les entiers à partir de 0 jusqu'à l'infini. Vous écrirez cette méthode est utilisant
la classe AbstractIterator mise à disposition par Guava.
// test unitaire
Iterable<Integer> fiveInts = Iterables.limit(HandsOn.enumPositiveInts(), 5);
assertThat(fiveInts).containsExactly(0, 1, 2, 3, 4);
Iterable<Integer> fiveNextInts = Iterables.limit(Iterables.skip(HandsOn.enumPositiveInts(), 5), 5);
assertThat(fiveInts).containsExactly(5, 6, 7, 8, 9);
Écrire la fonction HandsOn.fibs() qui retourne une liste infinie contenant la suite de Fibonnacci.
// test unitaire
assertThat(Iterable.limit(HandsOn.fibs(), 8)).containsExactly(0, 1, 1, 2, 3, 5, 8, 13);