繁体   English   中英

Hazelcast Java - Predicates.and 忽略除 first 以外的谓词

[英]Hazelcast Java - Predicates.and disregarding predicates other than first

我有一个以类为键的IMap 这个键有两个属性:

 static class MapKey implements Serializable{
        String uid;
        String service;

        public MapKey() {
        }

        public MapKey(String uid, String service) {
            this.uid = uid;
            this.service = service;
        }

        public String getUid() {
            return uid;
        }

        ...
    }

我只用两个简单的值初始化地图:

HazelcastInstance hz = Hazelcast.newHazelcastInstance();
final IMap<MapKey, String> map = hz.getMap("testmap");
map.addIndex("__key#uid", false);
map.put(new MapKey("uid1","service1"),"value1");
map.put(new MapKey("uid1","service2"),"value2");

然后我用ands构建一个谓词:

    static Predicate<MapKey, String> buildPredicate(MapKey key){
        final EntryObject entryObject = new PredicateBuilder().getEntryObject().key();
        final List<Predicate<MapKey, String>> predicateList = new ArrayList<>();
        predicateList.add(entryObject.get("uid").equal(key.getUid()));
        predicateList.add(entryObject.get("service").equal(key.getService()));

        final com.hazelcast.query.Predicate predicate = Predicates.and(predicateList.toArray(new Predicate[predicateList.size()]));
        return predicate;
    }

当我使用这个谓词时,它会返回仅由 uid 过滤的键,这意味着集合值的大小为 2 而不是预期的大小。

Predicate<MapKey, String> predicate = buildPredicate(new MapKey("uid1","service1"));
Collection<MapKey> values = map.keySet(predicate);

谁能解释我这种行为? 我缺少什么?

问题是你对entryObject进行操作是它是否是一个不可变的对象,但它不是不可变的。 它实际上是一个构建器,操作entryObject.get("uid").equal(key.getUid())改变其状态并记录谓词条件。 这就是为什么如果你在两个完全相等的 Predicates 上执行Predicates.and()

尝试以下操作,它将完成您尝试实现的目标。

   static Predicate<MapKey, String> buildPredicate(MapKey key){
        final List<Predicate<MapKey, String>> predicateList = new ArrayList<>();
        predicateList.add(new PredicateBuilder().getEntryObject().key().get("uid").equal(key.getUid()));
        predicateList.add(new PredicateBuilder().getEntryObject().key().get("service").equal(key.getService()));

        final com.hazelcast.query.Predicate predicate = Predicates.and(predicateList.toArray(new Predicate[predicateList.size()]));
        return predicate;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM