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

Sha*_*ild 6 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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是我当前循环我的字符项并将它们getAttackDamage()应用于返回结果的方式.

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

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

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

Tun*_*aki 10

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

double bonus = Arrays.stream(items)
                     .filter(Objects::nonNull)
                     .mapToDouble(Item::getAttackDamage)
                     .sum();
Run Code Online (Sandbox Code Playgroud)

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

  • @Tunaki教学提示:"打破函数式编程"并不是那些尚未购买功能编程优势的人(以及那些有,不需要被告知的人)的一个令人信服的解释.真正的原因是:命令式积累可组织性较差,可维护性较差(因为副作用在计算过程中深入发生,谁知道在哪里),而且不可并行化.减少解决了所有这些问题,*这就是为什么它更可取. (5认同)
  • @Tunaki对蓄能器模式的弊端的精辟探索:http://www.infoq.com/presentations/Thinking-Parallel-Programming (2认同)