首页 > 解决方案 > 如何对集合子集应用进一步的过滤器

问题描述

我正在处理以下贸易对象列表

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]排除

标签: javajava-8java-stream

解决方案


几乎没有尝试获得预期的结果,欢迎反馈以确定这是否是良好的做法/有效的方法

        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;
....
}

推荐阅读