Cómo utilizar BiPredicate con AnyMatch ()

Ishant Gaurav:

Tengo un conjunto de monedas como Set<String>y como RequiredCurrency Set<String>. Tengo que comprobar si alguno de moneda requerida está presente en moneda establecida o no. He escrito BiPredicatepara que, como más adelante y tratando de utilizar el mismo en anyMatch(). Pero no está funcionando para mí. Cómo puedo lograrlo .

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));

Soy incapaz de pasar la requestCurrencyCode en checkIfCurrencyPresent.test(currencyValues).

también:

Aunque idealmente me gustaría, así he preferido utilizarPredicate aquí, sin embargo, si tuviera que hacer un método genérico que podría ser utilizado en múltiples situaciones, se podría haber salvado a sí mismo de la envoltura de BiPredicatedentro de unPredicate utilizando el siguiente método de utilidad:

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

y luego consumida utilizando un lambda como:

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

de tal manera que no se basa en pruebas de una cadena contra una específica Sety se puede utilizar de forma genérica lo suficiente como:

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

Aparte : Las dos primeras líneas de su código posiblemente se podrían hacer más legible como algo parecido (suponiendo nombres de los modelos):

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

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=180896&siteId=1
Recomendado
Clasificación