我有一组Set<String>
的货币和Set<String>
的RequiredCurrency。我必须检查所需的货币是否以货币设置存在。我为此写了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));
我无法在checkIfCurrencyPresent.test(currencyValues)
中传递requestCurrencyCode。
答案 0 :(得分:1)
您不需要BiPredicate
。只需一个简单的Predicate
就可以做到。
Predicate<String> checkIfCurrencyPresent = currencyValues::contains;
boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
.anyMatch(checkIfCurrencyPresent);
这是一个更简洁的版本。
boolean isCurrencyCodeValid = requestCurrencyCodes.stream()
.anyMatch(currencyValues::contains);
答案 1 :(得分:1)
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
中。
答案 2 :(得分:1)
尽管理想情况下,我也应该在这里使用preferred using Predicate
,但是如果您要创建可在多种情况下使用的通用方法,则可以避免{{1 }}在BiPredicate
中使用以下实用程序方法:
Predicate
,然后使用lambda将其消耗为:
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
答案 3 :(得分:0)
只需补充到目前为止提供的良好答案即可。您可以通过Collections.disjoint
完成上述要求:
boolean isCurrencyCodeValid = !Collections.disjoint(currencyValues, requestCurrencyCodes);
如果isCurrencyCodeValid
中存在currencyValues
中的任何值,则 requestCurrencyCodes
将为true,否则为false。
完整代码:
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);