如何将BiPredicate与anyMatch()结合使用

时间:2019-01-05 05:32:00

标签: java java-8 predicate

我有一组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。

4 个答案:

答案 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。因此,不能直接将BiPredicateanyMatch一起使用。无论如何,从显示的代码中您都不需要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);