J'ai une String comme "ishant" et un Set comme ["Ishant", "Gaurav", "sdnj"]. J'ai besoin d'écrire le prédicat pour cela. J'ai essayé le code ci-dessous, mais cela ne fonctionne pas
Predicate<Set<String>,String> checkIfCurrencyPresent = (currencyList,currency) -> currencyList.contains(currency);
Comment puis-je créer un Predicate qui prendra Set et String comme paramètre et peut donner le résultat?
3 Réponses :
Un Prédicat que vous utilisez actuellement représente un prédicat (fonction à valeur booléenne) d'un argument .
Vous recherchez un BiPredicate qui représente essentiellement un prédicat (fonction à valeur booléenne) de deux arguments .
BiPredicate<Set<String>,String> checkIfCurrencyPresent = Set::contains;
ou avec une référence de méthode:
BiPredicate<Set<String>,String> checkIfCurrencyPresent = (set,currency) -> set.contains(currency);
Comment appeler ce prédicat dans le code? J'utilise ce code booléen isCurrencyCodeValid = requestCurrencyCodes.stream () .noneMatch (checkIfCurrencyPresent (currencyValues, requireCurr eny));
Si vous deviez vous en tenir à l'utilisation de Predicate , utilisez quelque chose de similaire à:
public boolean test(Set<String> set, String currency) {
return set.contains(currency);
}
La principale différence entre BiPredicate et Predicate serait leur implémentation de méthode de test . Un Predicate utiliserait
public boolean test(String o) {
return currencies.contains(o);
}
et un BiPredicate utiliserait plutôt
Set<String> currencies = Set.of("Ishant", "Gaurav", "sdnj");
String input = "ishant";
Predicate<String> predicate = currencies::contains;
System.out.print(predicate.test(input)); // prints false
La réponse d'Aomine est complète. l'utilisation de BiFunction est une autre façon:
BiFunction<Set<String>,String,Boolean> checkIfCurrencyPresent = Set::contains;