Как применить дополнительный фильтр к подмножеству коллекции - PullRequest
0 голосов
/ 11 мая 2019

Я работаю над приведенным ниже списком торговых объектов

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] ИСКЛЮЧЕНО

1 Ответ

0 голосов
/ 11 мая 2019

С небольшими попытками получить ожидаемые результаты, приветствуем обратную связь, чтобы выяснить, является ли это хорошей практикой / эффективным способом

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