Wpis z mikrobloga

@zb0oj: chodzi mi o zamianę takiego kodu na użycie streama, nie wiem czy to jest w ogóle możliwe

private double sumPath(List path){
double result=0;
for (int i = 1; i < path.size(); i++) {
result+=getDistanceBeetwen(i-1,i);
}
return result;
}
@krasnoludkolo: java ma kulawe te streamy. Nie da się łatwo zipować, a reduce musi mieć te same typy obu parametrów w funkcji agregującej, więc naturalna funkcyjna implementacja odpada. Zawsze można zrobić tak, jak poniżej, ale to mija się z celem IMHO.

double result = IntStream.range(0, path.length).map(i -> getDistanceBeetween(i, i-1)).sum();
@krasnoludkolo: zauważ, że lecimy po indeksach nie po elementach. IntStream.range(x, y) zwraca po prostu liczby kolejne całkowite od x do y bez ostatniej.

Skoro w Twoim przykładzie getDistanceBetween przyjmowało indeksy, to mój powinien być ok.

Natomiast miałem błąd off-by-one. Powinno być

double result = IntStream.range(1, path.length).map(i -> getDistanceBeetween(i, i-1)).sum();
@krasnoludkolo: Możesz jeszcze zrobić coś takiego:
double result[] = {0}; // tablica, bo Java jest upośledzona i musi być stała wartość
path.(it -> sum[0] += getDistanceBeetwen(i-1, i));

Tylko nie wiem co u Ciebie przyjmuje getDistanceBeetwen(), ale ja index danego patha w liście to możesz: path.indexOf(it)

Jednak wydaje mi się, że jet to mało czytelne i Twoja pętla jest najlepszym rozwiązaniem.

Może trochę nie na temat, ale niedawno wyszło repo z działaniami