如何对集合子集应用进一步的过滤器

时间:2019-05-10 21:48:56

标签: java java-8 java-stream

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

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-B在交易中没有针对Broker-B的条目,因此正在努力消除/排除此条目[[Fund-A,Broker-B,200]”。

其他信息 感谢您分享评论。根据要求,为了更加清晰起见,输出应该是资金Set<String>中存在资金的任何交易,并且还要确保如果选择[FUND-A, BROKER-A, 100],FUND-B的条目必须为[FUND-B, BROKER-A, 100] < / p>

期望输出为

    [Fund-A, Broker-A, 100]
    [Fund-B, Broker-A, 100]   

已排除[Fund-A, Broker-B, 200]

1 个答案:

答案 0 :(得分:0)

极少尝试能取得预期的结果,欢迎反馈以确定这是否是好的做法/有效方法

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