java - 使用流计算基于另一个字段的属性
问题描述
我有下面要转换为流的代码,在 parallelStream 或流中编写如此复杂的逻辑可能没有意义,但仍然想了解我们如何使用 lambda 表达式编写它。
for(PositionModel position :positionList)
{
StringBuffer line = new StringBuffer();
line.append(position.getInstrument());
line.append(CSV_SEPARATOR);
line.append(position.getAccount());
line.append(CSV_SEPARATOR);
line.append(position.getAccountType());
line.append(CSV_SEPARATOR);
List<TransactionModel> tranList = transactionMap.get(position.getInstrument());
int delta = 0;
if(tranList != null )
{
tranList.parallelStream().collect(Collectors.gr)
for(TransactionModel tran: tranList)
{
if(PositionCalcContant.BUY_INDICATOR.equals(tran.getTransactionType()))
{
if(PositionCalcContant.EXTERNAL.equals(position.getAccountType()))
{
delta += tran.getTransactionQuantity();
}
else
{
delta -= tran.getTransactionQuantity();
}
}
if(PositionCalcContant.SELL_INDICATOR.equals(tran.getTransactionType()))
{
if(PositionCalcContant.EXTERNAL.equals(position.getAccountType()))
{
delta -= tran.getTransactionQuantity();
}
else
{
delta += tran.getTransactionQuantity();
}
}
}
}
line.append(position.getQuantity()+delta);
line.append(CSV_SEPARATOR);
line.append(delta);
bw.write(line.toString());
bw.newLine();
position.setDelta(delta);
if(Math.abs(delta) > maxChange)
{
maxChange = delta;
maxChangeInstrument = position;
maxChangeInstrument.setDelta(delta);
}
if(Math.abs(delta) < minChange)
{
minChange = delta;
minChangeInstrument = position;
minChangeInstrument.setDelta(delta);
}
}
这里有 2 个循环我想将两者都转换为 lambda 或将内部循环转换为 lambda
解决方案
我正在尝试一些东西并在下面提出,这是否比原始代码更差/更好。
delta = tranList.parallelStream().collect
(Collectors.summingInt(model -> getDelta(model, position.getAccountType()))).intValue();
private int getDelta(TransactionModel tran, String accountType) {
int delta = 0;
if(PositionCalcContant.BUY_INDICATOR.equals(tran.getTransactionType()))
{
if(PositionCalcContant.EXTERNAL.equals(accountType))
{
delta += tran.getTransactionQuantity();
}
else
{
delta -= tran.getTransactionQuantity();
}
}
if(PositionCalcContant.SELL_INDICATOR.equals(tran.getTransactionType()))
{
if(PositionCalcContant.EXTERNAL.equals(accountType))
{
delta -= tran.getTransactionQuantity();
}
else
{
delta += tran.getTransactionQuantity();
}
}
return delta;
}
此外,这仅适用于我们计算 delta 的内部循环,即使我同意它会太复杂并且可能不值得。
推荐阅读
- assembly - 汇编程序:初始化变量的问题
- c# - 通过反射实现泛型类型参数接口的构建类型
- json - JSON 和 YAML 是否有等效于 DTD 或 XML 模式的方法?
- python-3.x - “AttributeError: Can only use .dt accessor with datetimelike values”同时尝试获取星期几
- r - 将小时和分钟列合并在一列中并获得 R 中的时差
- javascript - 当页面上显示的数据至关重要时,页面会不断刷新
- android - 如何在一定距离的路线周围区域上设置多边形(在 HereMaps 中)
- python - 如何将 pyqt4 中创建的列表中的项目按字母顺序返回
- delphi - Delphi Can't load package 找不到指定的模块
- scala - How to disable -Xfatal-warnings in Scala project?