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 BiPredicate
para 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)
.
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 BiPredicate
dentro 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 Set
y 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());