1.
double average(Lst<Lst<Integer>> l) {
return averageHelper(l.car(), l.cdr(), 0, 0);
}
double averageHelper(Lst<Integer> cur, Lst<Lst<Integer>> rest, int sum, int count) {
if (cur == null) {
if (rest == null) {
return (double)sum / count;
} else {
return averageHelper(rest.car(), rest.cdr(), sum, count);
}
}
return averageHelper(cur.cdr(), rest, sum + cur.car(), count + 1);
}
2.
<T> UnaryOperator<T> retainer(T e) {
var current = new Object() {
T value = e;
};
return (new_e) -> {
var old = current.value;
current.value = new_e;
return old;
};
}
3.
Stream<Character> toStream(String s) {
return IntStream.iterate(0, i -> i + 1)
.limit(s.length())
.mapToObj(i -> s.charAt(i));
}
4.
- Crée un record
SNavec les membressetnentiers. - Déclare une fonction
mysteriousprenant un Stream de IntStream. - Définit un opérateur
redqui pour deux SNpetqrenvoie un nouveau SN constitué de leur somme élément par élément. - Définit un Stream
subqui, pour chaque IntStream passé en entrée (dans le Streamstream), transforme chaque Integer en unSNcontenant ce nombre et 1, puis réduit tous lesSNrésultant à l'aide de l'opérateurred.- Pour un IntStream qui donne (a, b, c, ...) on obtient (SN(a, 1), SN(b, 1), SN(c, 1), ...). Ensuite, on réduit à l'aide de
red, ce qui donne unSNcomposé de la somme de tous lesset tous lesn. On obtient donc SN(a+b+c+...), SN(1+1+1+...). - En fait, on calcule ici la somme et le nombre des éléments de l'IntStream (
SN= Sum & Number).
- Pour un IntStream qui donne (a, b, c, ...) on obtient (SN(a, 1), SN(b, 1), SN(c, 1), ...). Ensuite, on réduit à l'aide de
- Parcourt
subpour ne garder que les valeurs présentes (ici, ça veut dire les valeurs issues deIntStreamnon vides). On réduit à nouveau en faisant la somme pour obtenir au final la somme de tous les éléments de tous les IntStream, et leur nombre. - On divise la somme par le nombre pour obtenir la moyenne, ou si le résultat était vide (donc qu'il n'y avait aucun
IntStreamnon vide), on renvoie simplementNaN.
Bref, la fonction mysterious calcule la moyenne des (sous-)éléments d'un Stream d'IntStream, comme la fonction de la question 1 pour une liste de listes.
5.
record Option<T>(T value) {
static <U> Option<U> empty() {
return new Option<>(null);
}
static <U> Option<U> of(U value) {
return new Option<>(value);
}
T orElse(T other) {
return value == null ? other : value;
}
<U> Option<U> map(Function<T, U> f) {
return value == null ? empty() : of(f.apply(value));
}
}