微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java否定布尔BiFunction

如何解决Java否定布尔BiFunction

我有一个类,它将检查一组密钥中是否包含一个密钥。 Map中使用MathingType s

描述了这些条件
public enum MatchingType {
    MATCH,MISMATCH
}

具有匹配类型谓词的地图

Map<MatchingType,Function<Set<String>,Predicate<String>>> predicateMap =
        Map.of(
                MATCH,set -> set::contains,MISMATCH,set -> not(set::contains)
        );

用法示例

public boolean isKeyAvailable(String key,MatchingType matchingType,Set<String> keys) {
    return predicateMap.get(matchingType)
                       .apply(keys)
                       .test(key);
}

现在我看到可以使用BiFunction重构上面的代码

Map<MatchingType,BiFunction<Set<String>,String,Boolean>> predicateMap =
        Map.of(
                MATCH,Set::contains,Set::contains //how to negate?
        );

public boolean isKeyAvailable(String key,Set<String> keys) {
    return predicateMap.get(matchingType)
                       .apply(keys,key);
}

但是如何排除Set::contains

解决方法

开始,有一个静态方法Predicate.not(Predicate),但是在BiPredicate中没有这样的方法。

您可能希望像实例方法negate一样使用BiPredicate,该实例方法自发行以来就可用:

BiPredicate<Set<String>,String> biPredicate = Set::contains;
    
Map<MatchingType,BiPredicate<Set<String>,String>> biPredicateMap =
    Map.of(
        MatchingType.MATCH,biPredicate,MatchingType.MISMATCH,biPredicate.negate()
    );
boolean result = biPredicateMap.get(matchingType)
                               .test(keys,key);

基于Function的功能接口没有取反,因为不能保证其lambda表达式返回Boolean

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。