我刚刚用 GAE 和我的持久映射完成了 Linq4j 的测试:
@Test
public void testLinq4j() {
Map<Long, String> map = Humongous.getMap("Users", LongParser.getInstance());
map.put(1L, "user1");
map.put(2L, "user2");
assertNotNull(map.get(1L));
assertNotNull(map.get(2L));
final List<Grouping<Object, Map.Entry<Long, String>>> result =
new ArrayList<Grouping<Object, Map.Entry<Long, String>>>();
Linq4j.asEnumerable(map.entrySet())
.where(new Predicate1<Map.Entry<Long,String>>() {
@Override
public boolean apply(Map.Entry<Long, String> v1) {
if (v1.getKey().equals(2L)){ // filter only those with ID == 2
return true;
}
return false;
}
})
.groupBy(
new Function1<Map.Entry<Long, String>, Object>() {
public Object apply(Map.Entry<Long, String> entry) {
return entry.getValue();
}
})
.into(result);
assertEquals(2, map.size());
assertEquals(1, result.size());
}
问题是:
Linq4j 如何在内部使用
map.entrySet()
or 使用它的方法asEnumerable
?在我的例子中map.entrySet()
,最终归结为一个数据存储PreparedQuery
,它对数据存储中与查询匹配的所有记录都有一个安全的迭代器——在持久映射的情况下,它匹配特定的每条记录kind
;这可能真的很大。如果我的地图(如上面的“用户”)包含一百万条记录,那么这个查询会非常缓慢地迭代每个Map.Entry
?当它找到一个可能导致 HeapOverFlowError 的 java.util.List`时会
linq4j
调用...toList()
Collection<E>? I ask this because calling this methods copied all the Datastore keys into