java - 如何对集合子集应用进一步的过滤器
问题描述
我正在处理以下贸易对象列表
List<Trades> =
[Fund-A, Broker-A, 100]
[Fund-A, Broker-B, 200]
[Fund-B, Broker-A, 100]
[Fund-C, Broker-D, 300]
List<String> = funds basically (list contains unique values)
[Fund-A]
[Fund-B]
预期输出通过交易(列表)和资金(列表)
[Fund-A, Broker-A, 100]
[Fund-B, Broker-A, 100]
我可以对包含基金列表中的任何基金的交易集合执行一个简单的过滤器,如下所示
trades.stream().filter(x -> funds.contains(x.getfund())).collect(Collectors.toList())
但这输出
[Fund-A, Broker-A, 100]
[Fund-A, Broker-B, 200]
[Fund-B, Broker-A, 100]
但在如何消除/排除此条目“[Fund-A, Broker-B, 200]”上苦苦挣扎,因为 Fund-B 在交易中没有针对 Broker-B 的条目。
附加信息
感谢您分享评论。根据要求共享更清晰,输出应该是资金中存在的任何交易,Set<String>
并确保如果[FUND-A, BROKER-A, 100]
选择,则必须有一个 FUND-B 条目,即[FUND-B, BROKER-A, 100]
期望输出为
[Fund-A, Broker-A, 100]
[Fund-B, Broker-A, 100]
与[Fund-A, Broker-B, 200]
排除
解决方案
几乎没有尝试获得预期的结果,欢迎反馈以确定这是否是良好的做法/有效的方法
List<EligibleBroker> possibleEligibles = trades.stream().filter(x -> funds.contains(x.getAcctCd()))
.collect(Collectors.groupingBy(TradeData::getBrokerCd))
.entrySet().stream().map(m -> {
EligibleBroker eligBrk = new EligibleBroker();
eligBrk.setBrokerCd(m.getKey());
eligBrk.setTarget(m.getValue().get(0).getTarget());
eligBrk.setAcctCd(m.getValue().stream().map(f -> f.getAcctCd()).collect(Collectors.toList()));
return eligBrk;
}).collect(Collectors.toList());
// TODO list equals requires fine tunning
List<EligibleBroker> eligibles = possibleEligibles.stream().filter(e -> e.getAcctCd().equals(funds)).collect(Collectors.toList());
在哪里
public class EligibleBroker {
private List<String> acctCd;
private String brokerCd;
private double target;
....
}
推荐阅读
- javascript - 计算两种颜色的对比色以确定两种颜色的边框颜色
- python - 在线程中运行函数时,Tkinter 正在打开新窗口
- git - 有什么方法可以让 github 桌面自动拉取和推送更改
- javascript - 导出按钮以在 Devextreme 中的数据网格之外使用
- swagger - Swagger Redoc CORS 问题与托管在另一台服务器上的 json 文件有关
- amazon-web-services - 无法在同一 cloudformation 堆栈中创建具有死信队列的 FIFO 队列
- javascript - 在 Redux 存储文件中遇到 Typescript 状态类型不匹配错误
- javascript - 使用表单时删除缓存的搜索
- c# - BitmapSource copypixels 方法不返回 rgb 像素数据
- c++ - C++ 中的类和封装 (OOP)