2015-11-21 22 views
5

Tôi có một số Item[] items có chứa một số chỉ số cơ bản về chính nó.Tôi có thể sử dụng biểu thức lambda để tích lũy tổng trong biến không?

public float getAttackDamage() { 
    float bonus = 0; 
    for(int i = 0 ; i < items.length; i++){ 
     if(items[i] != null){ 
      bonus += items[i].getAttackDamage(); 
     } 
    } 
    return baseAttackDamage + attackDamageScaling * level + bonus; 
} 

Mã trên là cách tôi hiện đang lặp qua các ký tự và áp dụng getAttackDamage() cho kết quả trả về.

Có cách nào tôi có thể viết lại điều này để sử dụng biểu thức lambda thay thế không? Tôi đã thử làm theo:

public float getAttackDamage() { 
    float bonus = 0; 
    Arrays.stream(items).forEach(i -> bonus += i.getAttackDamage()); 
    return baseAttackDamage + attackDamageScaling * level + bonus; 
} 

Nhưng nó không hoạt động (lỗi trình biên dịch). Điều này có khả thi không?

+1

Đó là biên dịch ở đây ... bạn có đang sử dụng java 8 không? – luanjot

+2

@luanjot Không có nó không biên dịch, 'tiền thưởng' không có hiệu quả cuối cùng. – Tunaki

+0

OK, xin lỗi, tôi phải sửa đổi các bit đó. Chỉ cần kiểm tra xem bit lambda có đúng không. Tôi xin lỗi. – luanjot

Trả lời

7

Vâng, bạn có thể có những điều sau đây:

double bonus = Arrays.stream(items) 
        .filter(Objects::nonNull) 
        .mapToDouble(Item::getAttackDamage) 
        .sum(); 

Bạn nên nhớ rằng forEach có lẽ không phải là phương pháp mà bạn muốn gọi. Nó phá vỡ lập trình chức năng (tham khảo ý kiến ​​của Brian Goetz). Trong mã này, một Dòng của mỗi mục của bạn được tạo ra. Các phần tử không null được lọc và ánh xạ tới một giá trị kép tương ứng với sát thương tấn công.

+0

Vâng, nó hoạt động rất tốt. Cảm ơn! Có lý do gì khi sử dụng nhật thực nếu tôi Ctrl + Space sau 'Mục ::' Tôi không thấy danh sách các tùy chọn tự động hoàn thành? Thật kỳ cục. –

+1

@ShaunWild Nó phụ thuộc vào rất nhiều yếu tố (nó có một lỗi biên dịch khác hay không, nếu bạn là một lambda hay không ...). Nhưng vâng, Eclipse tự động hoàn thành có thể được cải thiện một chút trong lĩnh vực này. Tuy nhiên, điều này rất khó thực hiện. – Tunaki

+5

@Tunaki Mẹo sư phạm: "phá vỡ lập trình chức năng" không phải là một lời giải thích hấp dẫn cho những người chưa được mua vào những lợi ích của lập trình chức năng (và những người có, không cần phải nói.) Lý do thực sự là: bắt buộc tích lũy ít composible, ít bảo trì hơn (vì tác dụng phụ đang xảy ra sâu ở giữa một tính toán, ai biết ở đâu), và không song song. Giảm địa chỉ tất cả những điều này, và * đó là lý do tại sao nó thích hợp hơn. –

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