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.过滤非空元素并将其映射到对应于攻击损坏的双精度值.