public double each(TreeWalkerInterface treeWalkerInterface) {
double aggregated = 0;
for (Double value : wrappedTree) {
aggregated += treeWalkerInterface.apply(aggregated, value);
}
return aggregated;
}
(a, v) -> Math.max(a,v) - a
package treelambda;
import java.util.TreeSet;
public class Tree {
private TreeSet<Double> wrappedTree;
public Tree() {
wrappedTree = new TreeSet<>();
}
public void add(double value) {
wrappedTree.add(value);
}
public int count() {
return wrappedTree.size();
}
public double each(TreeWalkerInterface treeWalkerInterface) {
double aggregated = 0;
for (Double value : wrappedTree) {
aggregated += treeWalkerInterface.apply(aggregated, value);
}
return aggregated;
}
public TreeSet<Double> getWrappedTree() {
return wrappedTree;
}
}
package treelambda;
@FunctionalInterface
public interface TreeWalkerInterface {
double apply(double aggrgated, double nodeValue);
}
package treelambda;
import org.junit.Before;
import org.junit.Test;
import java.util.DoubleSummaryStatistics;
import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class TreeTest {
private Tree tree;
private DoubleSummaryStatistics stats;
@Before
public void setUp() {
this.tree = new Tree();
tree.add(13);
tree.add(10.5);
tree.add(8);
tree.add(11);
stats = tree.getWrappedTree().stream().collect(Collectors.summarizingDouble(Double::doubleValue));
}
@Test
public void testMax() {
double max = tree.each((a, v) -> Math.max(a,v) - a);
assertThat(max, is(stats.getMax()));
}
@Test
public void testAvg() {
double avg = tree.each((a, v) -> v) / tree.count();
assertThat(avg, is(stats.getAverage()));
}
}
Der aggregierte Wert hat beim ersten Aufruf den Wert 0. Bei allen folgenden Aufrufen den zuletzt durch apply zurückgegebenen Wert.
Der aggregierte Wert hat beim ersten Aufruf den Wert 0. Bei allen folgenden Aufrufen den zuletzt durch apply zurückgegebenen Wert plus dem vorherigen Wert.
Das habe ich doch bereits beschrieben. Weiter: a wird ja für jeden Aufruf mitgegeben und dient somit als "Puffer" um Informationen zwischen 2 Aufrufen zu teilen. In dem Fall ist die Information die zum Aufruf bekannte höchste Zahl. Mit Math.max ermitte ich die höhere der Beiden Zahlen und gebe die Differenz zur alten höheren Zahl zurück. Die die zurückgegebene Differenz des Lambdas wird ja in aggregated aufsummiert. Also summiere ich entweder 0 auf oder v-a auf. Ich kann es leider schlecht erklären. Einfach im Debugger mal nachvollziehen.wieso ziehst du dann bei der 2. -a ab?
sieheund wie würde dann die Lösung für die 3 aussehen?
Hast du die Antwort überhaupt gelesen?Die Lösung für 3. kannst du im Code nachvollziehen.
Du musst beachten, dass ich die Aufgabe anders als DrZoidberg verstanden habe und vermutlich falsch: Ich ging ja davon aus, dass aggregated die Summe sein soll.Mir wird bei der 3. nicht klar was der Ausdruck "(a, v)-> v)/ tree.count() "macht?