Ola*_*obi 4 java lambda java-8 java-stream
我有数据库中的这些示例记录,这是按查询分组的结果:
[
{
"name": "Troy",
"acct": 1123,
"type": " Savings",
"total": 50
},
{
"name": "Larry",
"acct": 4233,
"type": " Savings",
"total": 200
},
{
"name": "Troy",
"acct": 1123,
"type": " Current",
"total": 120
},
{
"name": "Larry",
"acct": 4233,
"type": " Current",
"total": 220
}
]
Run Code Online (Sandbox Code Playgroud)
现在,我需要创建一个如下所示的报告:
[
{
"name": "Troy",
"acct": 1123,
"totalSavings": 50,
"totalCurrent": 120
},
{
"name": "Larry",
"acct": 4233,
"totalSavings": 200,
"totalCurrent": 220
}
]
Run Code Online (Sandbox Code Playgroud)
。
public class DbTrans {
private String name;
private String acct;
private String type;
private double total;
// getters and setters
...
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用像下面这样的一些lambda技术,但是我仍然没有接近我想要的解决方案。
Map<String, List<DbTrans>> collect = transList.stream().collect(
Collectors.groupingBy(f -> f.getType()));
Run Code Online (Sandbox Code Playgroud)
首先,响应Dto与请求Dto不同,我建议创建一个新的Response类,并称之为:
public class DbTransResponse {
private String name;
private String acct;
private double totalSavings;
private double totalCurrent;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
那么结果可以像这样:
List<DbTransResponse> result = transList.stream()
.collect(Collectors.groupingBy(DbTrans::getAcct))
.values().stream()
.map(trans -> new DbTransResponse(
trans.get(0).getName(),
trans.get(0).getAcct(),
trans.get(0).getTotal(),
trans.get(1).getTotal()
)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我认为该列表应包含每个名称的两个条目,以便您可以totalSavings从第一个条目trans.get(0).getTotal()和totalCurrent第二个条目中获取trans.get(1).getTotal()。
如果不确定,可以使用条件填充对象,例如,可以检查是否有两个元素(如果未设置默认值)。
产出
DbTransResponse{name='Larry', acct='4233', totalSavings=200.0, totalCurrent=220.0}
DbTransResponse{name='Troy', acct='1123', totalSavings=50.0, totalCurrent=120.0}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |