2015-11-21 21 views
5

私はItem[] itemsを持っていますが、それにはいくつかの基本的な統計が含まれています。 ラムダ式を使用して変数に合計を累積できますか?

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

上記のコード

はI現在、私の文字項目をループとは、その getAttackDamage()リターン結果にどのように適用されるかです。

ラムダ式を代わりに使用する方法はありますか?私は以下を試した:

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

しかし、それは動作しませんでした(コンパイラエラー)。 これは可能ですか?

+1

ここでコンパイルされています...あなたはJava 8を使用していますか? – luanjot

+2

@luanjotそれはコンパイルされません、 'bonus'は事実上最終的ではありません。 – Tunaki

+0

申し訳ありませんが、私はこれらのビットを修正しなければなりませんでした。ちょうどラムダビットが正しいことを確認しました。ごめんなさい。 – luanjot

答えて

7

はい、あなたは以下を持つことができます:

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

あなたはforEachは、おそらくあなたが呼び出したいメソッドではないことを覚えておいてください。それは機能プログラミングを破る(Brian Goetzのコメントを参照してください)。このコードでは、各アイテムのストリームが作成されます。非ヌル要素はフィルタリングされ、攻撃のダメージに対応する倍の値にマッピングされます。

+0

はい、うまくいきます。ありがとう! 'Item ::'の後にCtrl + Spaceキーを押して、自動補完オプションのリストが表示されない場合は、何かの理由がありますか?それはちょっと変だ。 –

+1

@ShaunWildそれは多くの要素に依存します(ラムダであれば、別のコンパイルエラーでもそうでなくても...)。しかし、ええ、Eclipseの自動補完は、この分野で少し改善される可能性があります。しかし、これは実際には非常に困難です。 – Tunaki

+5

@Tunaki教育学のヒント: "関数型プログラミングを壊す"というのは、関数型プログラミングの利点をまだ購入していない人にとっては説得力のある説明ではありません。 (計算の途中で深刻な副作用が発生し、どこで誰が知っているのか、並列化できないため)削減はこれらすべてのものに対処しています。 –

関連する問題