2016-10-14 8 views
5

W Javie 8, jeśli mam listę obiektów tak:Podsumowując wiele różnych pól na liście obiektów za pomocą api strumieni?

MyObject 
    double a; 
    double b; 
    double c; 

chcę uzyskać sumy każdego z tych pól na liście obiektów. Jednym ze sposobów, mogę to zrobić, jest następujący:

double totalA = myListOfObjects.stream().map(e -> e.getA()).reduce(0.0, (x, y) -> x + y); 
double totalB = myListOfObjects.stream().map(e -> e.getB()).reduce(0.0, (x, y) -> x + y); 
double totalC = myListOfObjects.stream().map(e -> e.getC()).reduce(0.0, (x, y) -> x + y); 

Ale jest tam z dala, aby połączyć to w jednym przejściu przez listę obiektów usng api strumieni? Gdybym tylko napisał do/while (patrz poniżej) i ręcznie sumowane przez 3 sumy, które wydają się bardziej skuteczny wówczas ponad 3 linie kodu)

for (MyObject obj: myListOfObjects) { 
    totalA += obj.getA(); 
    totalB += obj.getB(); 
    totalC += obj.getC(); 
} 

Dzięki

Odpowiedz

7

można zredukować do nowe MyObject obiekty takie jak ten:

MyObject totals = myListOfObjects.stream() 
    .reduce((x, y) -> new MyObject(
     x.getA() + y.getA(), 
     x.getB() + y.getB(), 
     x.getC() + y.getC() 
    )) 
    .orElse(new MyObject(0, 0, 0)); 

totalA = totals.getA(); 
totalB = totals.getB(); 
totalC = totals.getC(); 

Zresztą nie sądzę, trzeba martwić się o wydajność tutaj. Wszystkie trzy rozwiązania (2 w pytaniu + moje powyżej) mają złożoność czasową O(n). Poleciłbym lekturę dotyczącą przedwczesnych optymalizacji. Po prostu przejdź do kodu, który jest najbardziej czytelny i najłatwiejszy do zrozumienia.

+0

Dzięki Jarosław, właśnie tego szukałem – Pat

Powiązane problemy