Tag: 番石榴

如何使用Guava将MultiMap 转换为Map <Integer,Set >?

我正在使用Google Guava 12中的MultiMap,如下所示: Multimap pkgPOP = HashMultimap.create(); 将值插入此multimap后,我需要返回: Map<Integer, Set> 但是,当我这样做时: return pkgPOP.asMap(); 它归还给我 Map<Integer, Collection> 如何返回Map<Integer, Set> ?

为什么Cache.asMap()与Cache.size()不一致?

在Guava库中,我很困惑为什么Cache.asMap()与Cache.size()不一致,除非Cache.cleanUp() 。 Cache cache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.SECONDS) .build(); cache.get(…); … //After some seconds, all entries are expired. //cache.asMap() is EMPTY Map, but cache.size() != 0 所以我的问题是: Cache.asMap()与Cache.size()不一致是错误吗? 虽然我注意到Cache.size()的javadoc是: /** * Returns the **approximate** number of entries in this cache. */ 我猜它可能与并发环境有关。 而Cache.cleanUp()究竟做了什么?

案例使用Google Guava进行不敏感排序

目前我在2个不同的地方使用以下2段代码来创建一个排序的,不可变的列表。 return Ordering.natural().immutableSortedCopy(iterable); 和 return Ordering.usingToString().immutableSortedCopy(machines); 但是,这使得“排序”区分大小写 。 如何使用guava apis创建不区分大小写的排序不可变列表?

Google Collections中的懒惰不可修改列表

我正在寻找一个通用的懒惰不可修改列表实现的一个不错的实现来包装我的搜索结果条目。 任务的不可修改部分很容易,因为它可以通过Collections.unmodifiableList()实现,所以我只需要理清惰性部分。 令人惊讶的是, 谷歌collections品没有提供任何东西; 而来自Apache Commons Collections的LazyList不支持generics。 我发现尝试在google-collections之上构建一些东西,但它似乎是不完整的(例如,不支持size() ),过时的(不用1.0最终编译)并需要一些外部类,但可以用作建立自己的课程的一个很好的起点。 是否有人知道LazyList的任何良好实现? 如果没有,您认为哪个选项更好: 编写我自己的实现,基于google-collections ForwardingList,类似于Peter Maas所做的; 在Commons Collections LazyList周围编写我自己的包装器(包装器只会添加generics,所以我不需要在任何地方进行转换,只能在包装器本身中进行转换); 只需在java.util.AbstractList上面写一些东西; 欢迎任何其他建议。 编辑:解释为什么我需要一个懒惰的列表。 我有一个Lucene搜索结果(TopDocs),它基本上是Lucene文档的一堆指针。 我的搜索结果类将这些指针作为输入并返回由提取的和以其他方式处理的Lucene文档组成的对象列表。 通过将所有内容包装到一个惰性列表中,我希望确保在不必要时不进行昂贵的处理。

以Class 为关键创建ImmutableMap的问题

我正在尝试创建一个将类映射到字符串的ImmutableMap (注意:这当然只是一个例子!)。 但是,像 ImmutableMap<Class, String> map = ImmutableMap.of( Integer.class, “Integer”, Date.class, “Date” ); 给我以下错误 Type mismatch: cannot convert from ImmutableMap<Class<? extends Object&Comparable&Serializable>,String> to ImmutableMap<Class,String> 奇怪的是,如果我将一个强制转换为Class到任何(!)的键,即 ImmutableMap<Class, String> map = ImmutableMap.of( Integer.class, “Integer”, Date.class, “Date”, (Class) String.class, “String”, long.class, “Long” ); 会工作得很好。 我有点对这种行为感到困惑:首先,为什么没有演员表它不起作用? 所有这些都是类,它实际上没有比Class更通用,所以为什么它不起作用? 其次,为什么任何一个键上的强制转换都能使它工作? (旁注:如果你想知道为什么我甚至想做这样的事情 – 是的,这是因为反思…) 编辑:我实际上只是发现这会起作用,但我仍然想了解上述行为 ImmutableMap<Class, String> map = ImmutableMap.<Class, String>builder() .put( […]

在番石榴中反向供应商

我正在寻找Guava中Supplier的反面。 我希望它可以被称为Consumer – 诺普 – 或者Sink – 存在,但它是原始价值观。 它隐藏在某处,我想念它吗? 我希望看到它与Supplier有用的原因相同。 不可否认,用途不太常见,但Suppliers许多静态方法,例如,将以类似的方式应用,并且在一行中表达诸如“将此供应商的每个值发送给此供应商”这样的事情将是有用的。 与此同时, Predicate和Function是丑陋的变通方法。

从Guava RemovalListener重新插入条目是否安全?

我有一个Guava Cache (或者更确切地说,我正在从MapMaker迁移到Cache ),这些值代表长时间运行的作业。 我想将expireAfterAccess行为添加到缓存中,因为这是清理它的最佳方法; 但是,即使在一段时间内没有通过缓存访问该作业,该作业仍可能仍在运行,在这种情况下,我需要阻止它从缓存中删除。 我有三个问题: 在RemovalListener回调期间重新插入正在删除的缓存条目是否安全? 如果是这样,它是线程安全的,这样,当RemovalListener回调仍在另一个线程中发生时, CacheLoader没有可能产生该键的第二个值吗? 有没有更好的方法来实现我想要的? 这不是严格/只是一个“缓存” – 每个密钥只使用一个且只有一个值是至关重要的 – 但是我还希望在它表示的作业完成后将条目缓存一段时间。 之前我正在使用MapMaker ,我需要的行为现在已在该类中弃用。 在作业运行时定期ping地图是不优雅的,在我的情况下,不可行。 也许正确的解决方案是拥有两个地图,一个没有驱逐,一个有,并在完成时将它们迁移。 我也会提出一个function请求 – 这可以解决问题:允许锁定单个条目以防止驱逐(然后解锁)。 [编辑以添加一些细节]:此地图中的键指的是数据文件。 这些值可以是正在运行的写入作业,也可以是已完成的写入作业,或者 – 如果没有正在运行的作业 – 是一个只读,生成在查找对象,其中包含从文件中读取的信息。 每个文件正好有零个或一个条目,这一点很重要。 我可以为这两件事使用单独的地图,但必须在每个键的基础上进行协调,以确保一次只存在一个或另一个。 在获得并发性方面,使用单个映射使其更简单。

Maps.newHashMap与新HashMap返回的HashMap

我第一次尝试番石榴,我发现它真的很棒。 我在Spring jdbc模板上执行几个参数化检索查询。 DAO( AbstractDataAccessObject )中的方法是这样的。 这里没问题。 public Map getResultAsMap(String sql, Map parameters) { try { return jdbcTemplate.queryForMap(sql, parameters); } catch (EmptyResultDataAccessException e) { //Ignore if no data found for this query logger.error(e.getMessage(), e); } return null; } 这是问题所在: 当我用这个方法调用时 getResultAsMap(query, new HashMap(ImmutableMap.of(“gciList”,gciList))); 它很棒。 但是当我这样做的时候 getResultAsMap(query, Maps.newHashMap(ImmutableMap.of(“gciList”,gciList))); 编译器不高兴说 The method getResultAsMap(String, Map) in the type […]

如何模拟多参数副作用函数

我想模仿以下界面: interface MultiSideEffectFunction { void action(T first, T second); } (这将使我免于必须引入新的界面) 有没有一种首选的番石榴方法来做到这一点? 注意:我考虑过这样做 Function<Pair, Void> 但是有两个问题使得创建新界面更可取: 必须定义一个名为Pair的类,它看起来很像Map.Entry具有更合适的getter名称(作为第二个问题:是否有像这样的Guava类型?)。 Void返回类型总是很痛苦 – 拥有真正的void签名会更好。

Guava Cache的读锁是免费的

我正在使用Guava的Cache并将concurrencyLevel设置为1因此在驱逐时会利用最大容量。 以下是我的代码: CacheBuilder.newBuilder() .maximumWeight(maxWeight) .concurrencyLevel(1) .expireAfterWrite(expireDuration, TimeUnit.MINUTES) .removalListener(new RemovalListener() { @Override public void onRemoval(RemovalNotification removalNotification) { log.warn(removalMsg + removalNotification.getKey()); } }) .weigher(weigher) .build(); concurrencyLevel的文档说明了这一点: 指导更新操作中允许的并发性。 用作内部尺寸的提示。 该表在内部进行分区,以尝试允许指定数量的并发更新而不会发生争用… 因此我假设concurrencyLevel只对update operations起作用,即使使用concurrencyLevel(1) , READs are Lock Free 。 我的假设是否正确? 编辑:我看了Guava缓存代码,看起来我的假设READs READs are lock free是正确的。 在get(K, Callable)情况下,它最初尝试获取没有锁定的值,并且如果指定键的条目为空或仅已过期,则它将进入锁定的Get或Load。 如果我在这里错了,请纠正我。