java - 将 for 循环重构为 Java 8 并行流
问题描述
public Double getTotal()
{
Double totalAmount = 0D;
long memberCount = 200;
List<Fee> fees = feesMngr.all();
for (FeeDto fee : fees)
{
if(fee.type.equals(FeeType.REGISTRATION))
{
Optional<Year> currentYear = this.getCurrentYear();
if(currentYear.isPresent())
{
FeeDto addServiceCharge = feesMngr.getFeeByType(FeeType.SERVICE_FEE);
totalAmount +=(addServiceCharge.getAmount() * memberCount);
}
if(feesMngr.getFeeByType(FeeType.LIBRARY_FEE) != null)
{
totalAmount += (200 * memberCount);
}
}
else{
totalAmount += (fee.getAmount() * memberCount);
}
}
return totalAmount;
}
我做了类似以下的事情,但不断出现红线;告诉我“从 lambda 表达式引用的局部变量必须是最终的或有效的最终”。当我宣布 totalAmount 最终时,仍然没有解决任何问题。
fees.parallelStream()
.forEach(
(fee) -> {
if (fee.getType().equals(FeeType.REGISTRATION.name())) {
FeeDto addServiceCharge = feesMngr.getFeeByType(FeeType.SERVICE_FEE);
totalAmount += (fee.getAmount() * memberCount);
}
else {
totalAmount += (fee.getAmount() * memberCount);
}
});
解决方案
在第一步中,为每个条件获取金额值。之后,您可以进行整个计算:
long memberCount = 200;
return feesMngr.all().parallelStream().map(fee -> {
if (fee.type.equals(FeeType.REGISTRATION)) {
Optional<Year> currentYear = this.getCurrentYear();
if (currentYear.isPresent()) {
return feesMngr.getFeeByType(FeeType.SERVICE_FEE).getAmount();
}
if (feesMngr.getFeeByType(FeeType.LIBRARY_FEE) != null) {
return 200D;
}
return 0D;
} else {
return fee.getAmount();
}
}).reduce(0D, (subAmount, factor) -> subAmount + (factor * memberCount));
推荐阅读
- swift - 将 UILabel 设置为粗体?
- python - Pyinstaller 生成不执行任何操作的 EXE
- c# - 为什么视图无法在客户端显示学生数据并且它是 ASP.NET MVC?
- java - 列表
- > 到二维数组的转换 (int[][])
- angular - 茉莉模拟值和服务值不同
- java - 在输入的情况下创建不同的装饰对象
- java - 尝试打开某些活动时,Android 应用程序关闭
- telegram-bot - 与机器人聊天时的自定义键盘
- ios13 - 在 iOS 13 中使用 NDI SDK 4.5 的视频广播不起作用。局域网接收器收不到任何视频包
- ios - 使用单个按钮 Xcode 或 swift 切换视图控制器的背景颜色