首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hazelcast Java - Predicates.and忽略除first之外的谓词

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

Stack Overflow用户
提问于 2020-03-17 23:00:29
回答 1查看 205关注 0票数 0

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

代码语言:javascript
复制
 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;
        }

        ...
    }

我只用两个简单的值初始化了map:

代码语言:javascript
复制
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构建一个谓词:

代码语言:javascript
复制
    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,而不是预期的大小。

代码语言:javascript
复制
Predicate<MapKey, String> predicate = buildPredicate(new MapKey("uid1","service1"));
Collection<MapKey> values = map.keySet(predicate);

有人能解释这种行为吗?我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-03-19 19:30:34

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

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

代码语言:javascript
复制
   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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60724968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档