我可以使用lambda表达式来累积变量中的和吗?

时间:2015-11-21 16:10:08

标签: java lambda java-8 java-stream

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

以上代码是我目前如何遍历我的字符项并将其getAttackDamage()应用于返回结果。

有没有办法可以重写这个来使用lambda表达式?我尝试了以下内容:

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

但它不起作用(编译器错误)。 这可能吗?

1 个答案:

答案 0 :(得分:9)

是的,您可以拥有以下内容:

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

您应该记住,forEach可能不是您要调用的方法。它打破了函数式编程(参考Brian Goetz的评论)。在此代码中,将创建每个项目的Stream。非空元素被过滤并映射到对应于攻击伤害的双重值。