Как использовать BiPredicate с anyMatch () - PullRequest
0 голосов
/ 05 января 2019

У меня есть набор валют как Set<String> и RequiredCurrency как Set<String>. Я должен проверить, присутствует ли какая-либо из требуемой валюты в установленной валюте или нет. Я написал BiPredicate для этого, как показано ниже, и пытаюсь использовать то же самое в anyMatch(). Но это не работает для меня. Как мне этого добиться.

Set<String> currencyValues = currencies.getCurrencies().values()
                    .stream()
                    .map(currencyEntity -> {
                       return currencyEntity.getNameOfSymbol();
                    }).collect(Collectors.toSet());

Set<String> requestCurrencyCodes = globalPricingRequests.stream().map(globalPricingRequest -> {
    return globalPricingRequest.getCurrencyISOCode();
}).collect(Collectors.toSet());

BiPredicate<Set<String>, String> checkIfCurrencyPresent = Set::contains;

boolean isCurrencyCodeValid = requestCurrencyCodes.stream().anyMatch(checkIfCurrencyPresent.test(currencyValues));

Я не могу передать requestCurrencyCode в checkIfCurrencyPresent.test(currencyValues).

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Просто чтобы добавить хорошие ответы, предоставленные до сих пор. Вы можете выполнить указанное требование через Collections.disjoint:

boolean isCurrencyCodeValid = !Collections.disjoint(currencyValues, requestCurrencyCodes);

isCurrencyCodeValid будет истинным, если какое-либо значение в currencyValues присутствует в requestCurrencyCodes, иначе ложно.

Полный код:

Set<String> currencyValues = currencies.getCurrencies().values()
                              .stream()
                              .map(CurrencyEntity::getNameOfSymbol)
                              .collect(toSet());

Set<String> requestCurrencyCodes = globalPricingRequests.stream()
        .map(GlobalPricingRequest::getCurrencyISOCode)
        .collect(toSet());

boolean isCurrencyCodeValid = !Collections.disjoint(currencyValues, requestCurrencyCodes);
0 голосов
/ 05 января 2019

Метод Stream.anyMatch занимает Predicate, а не BiPredicate. Поэтому вы не можете использовать BiPredicate напрямую с anyMatch. Из кода, который вы показали, вам не нужно BiPredicate в любом случае. Просто сделай:

boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
        .anyMatch(currencyValues::contains);

Если вы действительно хотите по какой-то причине использовать BiPredicate, вы можете сделать:

BiPredicate<Set<String>, String> checkIfCurrencyPresent = Set::contains;
boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
        .anyMatch(code -> checkIfCurrencyPresent.test(currencyValues, code));

Однако я не знаю, почему вы хотите это сделать. Все, что он делает, это оборачивает BiPredicate в Predicate.

0 голосов
/ 05 января 2019

Хотя в идеале я бы предпочел использовать , используя Predicate, но если бы вы создали общий метод, который можно было бы использовать в нескольких ситуациях, вы могли бы сэкономить самостоятельно из обернуть BiPredicate в Predicate, используя следующий служебный метод:

private static boolean checkIfCurrencyPresent(Set<String> set, String currency) {
    return set.contains(currency);
}

, а затем потребляет его, используя лямбду как:

boolean isCurrencyCodeValid = requestCurrencyCodes
        .stream()
        .anyMatch(a -> checkIfCurrencyPresent(currencyValues,a));

такой, что он не полагается на проверку строки на конкретном Set, и вы можете использовать его достаточно обобщенно, как:

boolean isCurrencyCodeValidInverseExample = currencyValues // any collcetion of string
        .stream()
        .anyMatch(a -> checkIfCurrencyPresent(requestCurrencyCodes, a)); // different set as an input

В сторону : первые две строки вашего кода можно сделать более читабельными, например, (при условии названий моделей):

Set<String> currencyValues = currencies.getCurrencies().values()
        .stream()
        .map(CurrencyEntity::getNameOfSymbol)
        .collect(Collectors.toSet());

Set<String> requestCurrencyCodes = globalPricingRequests.stream()
        .map(GlobalPricingRequest::getCurrencyISOCode)
        .collect(Collectors.toSet());
0 голосов
/ 05 января 2019

Вам не нужно BiPredicate. Скорее просто Predicate сделает это.

Predicate<String> checkIfCurrencyPresent = currencyValues::contains;

boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
        .anyMatch(checkIfCurrencyPresent);

А вот более сжатая версия.

boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
        .anyMatch(currencyValues::contains);
...