2016-10-14 23 views
5

Trong Java 8, nếu tôi có một danh sách các đối tượng như thế này:Tổng hợp nhiều trường khác nhau trong danh sách đối tượng bằng cách sử dụng luồng api?

MyObject 
    double a; 
    double b; 
    double c; 

Tôi muốn nhận được tổng số của mỗi người trong các lĩnh vực trong danh sách các đối tượng. Một cách tôi có thể thực hiện, như sau:

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); 

Nhưng có cách nào để kết hợp điều này vào một danh sách đối tượng sử dụng luồng api không? Nếu tôi chỉ viết một efficent cho/Vòng lặp while (xem dưới đây) và bằng tay thêm lên 3 tổng số, mà dường như nhiều hơn sau đó 3 dòng trên mã)

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

Cảm ơn

Trả lời

7

Bạn có thể giảm vào new MyObject các đối tượng như thế này:

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(); 

Dù sao, tôi không nghĩ bạn nên lo lắng về hiệu suất tại đây. Cả ba giải pháp (2 trong câu hỏi của bạn + của tôi ở trên) đều có độ phức tạp thời gian là O(n). Tôi khuyên bạn nên làm một số đọc về tối ưu hóa sớm. Chỉ cần đi cho mã đó là dễ đọc nhất và dễ hiểu nhất.

+0

Xin cảm ơn Jaroslaw, đó chính xác là những gì tôi đang tìm kiếm – Pat

Các vấn đề liên quan