问题标签 [guava]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6610 浏览

java - 以 Reader 身份打开 InputStream

我可以轻松转换InputStreamBufferedReader使用番石榴吗?

我正在寻找类似的东西:

我可以使用Files.newReader(File file, Charset charset). 这很酷,我想使用InputStream.

更新:

使用CharStreams.newReaderSupplier对我来说似乎很冗长。如果我错了,请纠正我,但为了轻松转换InputStreamBufferedReader使用 Guava,我必须这样做:

当然我可以创建助手做某事:

但是我认为 Guava IO 应该提供这样的帮助。我可以为 File 实例做这样的把戏。为什么我不能为 InputStream?

纠正我如果我错了,但在我看来就像缺少 API。

0 投票
6 回答
2561 浏览

guava - 如何使用谓词从转换后的集合中删除元素?

如果我有一个ArrayList<Double> dblList和一个Predicate<Double> IS_EVEN,我可以从dblList使用中删除所有偶数元素:

然而,如果dblList是这样的转变的结果

这不再起作用,因为转换后的列表是不可变的:-)

有什么解决办法吗?

0 投票
4 回答
951 浏览

java - 计算地图:提前计算价值

我有一个计算图(带有软值),用于缓存昂贵计算的结果。

现在我有一种情况,我知道可能会在接下来的几秒钟内查找特定的键。该密钥的计算成本也比大多数密钥高。

我想在最低优先级线程中提前计算该值,以便当最终请求该值时,它已经被缓存,从而提高了响应时间。

这样做的好方法是什么:

  1. 我可以控制执行计算的线程(特别是它的优先级)。
  2. 避免了重复工作,即计算只进行一次。如果计算任务已经在运行,则调用线程等待该任务而不是再次计算值(FutureTask实现这一点。使用 Guava 的计算映射,如果你只调用get,但如果你将它与调用混合,则不是这样put。)
  3. “预先计算值”方法是异步的和幂等的。如果计算已经在进行中,它应该立即返回,而无需等待该计算完成。
  4. 避免优先级倒置,例如,如果一个高优先级线程请求该值,而一个中等优先级线程正在做一些不相关的事情,但计算任务在一个低优先级线程上排队,那么高优先级线程不能被饿死。也许这可以通过临时提高计算线程的优先级和/或在调用线程上运行计算来实现。

这如何在所有涉及的线程之间进行协调?


附加信息
我的应用程序中的计算是图像过滤操作,这意味着它们都受 CPU 限制。这些操作包括仿射变换(范围从 50µs 到 1ms)和卷积(最长 10ms)。当然,不同线程优先级的有效性取决于操作系统抢占较大任务的能力。

0 投票
3 回答
5985 浏览

guava - 使用 MapMaker 创建缓存

我想使用 MapMaker 创建一个缓存大对象的地图,如果没有足够的内存,应该从缓存中删除。这个小演示程序似乎运行良好:

然而,当我在我的真实应用程序中做同样的事情时,条目基本上一被添加就从缓存中删除。在我的实际应用程序中,我也使用整数作为键,缓存值是从磁盘读取的包含一些数据的存档块。据我了解,弱引用一旦不再使用就会被垃圾收集,所以这似乎是有道理的,因为键是弱引用。如果我这样创建地图:

这些条目永远不会被垃圾收集,并且我的测试程序中出现内存不足错误。TestValue 条目上的 finalize 方法永远不会被调用。如果我将测试方法更改为以下内容:

从缓存中删除条目并调用 TestValue 对象的终结器,但过了一会儿我也得到了内存不足的错误。

所以我的问题是:使用 MapMaker 创建可用作缓存的地图的正确方法是什么?如果我使用weakKeys,为什么我的测试程序没有尽快删除条目?是否可以将引用队列添加到缓存映射?

0 投票
6 回答
21873 浏览

java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器

我想从网络应用程序的各个地方收集一些指标。为简单起见,所有这些都是计数器,因此唯一的修饰符操作是将它们增加 1。

增量将是并发的并且经常发生。读取(转储统计信息)是一种罕见的操作。

我正在考虑使用ConcurrentHashMap。问题是如何正确增加计数器。由于地图没有“增量”操作,我需要先读取当前值,然后将其递增而不是将新值放入地图中。如果没有更多代码,这不是原子操作。

是否可以在不同步的情况下实现这一点(这会破坏ConcurrentHashMap的目的)?我需要看番石榴吗?

感谢您的任何指示。


PS
有一个关于SO(在Java中增加Map值的最有效方法)的相关问题,但专注于性能而不是多线程

更新
对于那些通过搜索同一主题到达这里的人:除了下面的答案之外,还有一个有用的演示文稿,顺便涵盖了同一主题。见幻灯片 24-33。

0 投票
3 回答
748 浏览

java - 谷歌番石榴和我无法弄清楚的错误

尝试编译时出现此错误:

Iterables 类型中的方法filter(Iterable<T>, Predicate<? super T>)不适用于参数 ( Iterator<PeopleSoftBalance>, ColumnLikePredicate<PeopleSoftBalance>)

这是 ColumnLikePredicate 类信号:

我究竟做错了什么?

0 投票
2 回答
2082 浏览

java - IllegalAnnotationsException SetMultimap 是一个接口,而 JAXB 无法处理接口

我有以下代码:

这给了我以下例外。

我的问题是,为什么这不起作用,但这样做:

以及如何修复 SetMultimap 以使 JAXB 满意?

0 投票
2 回答
5524 浏览

java - Guava ForwardingList 使用示例

我正在寻找解释 Guava ForwardingList 类的示例代码。基本上,我正在实现一个自定义 ArrayList 类,该类将用于解决我之前的 SO 问题中提到的这个要求。我以前从未使用过谷歌收藏。但是通过查看ForwardingList 的 JavaDoc,我想我可以通过子类 ForwardingList 来实现我的自定义类。

0 投票
3 回答
2423 浏览

java - 尽可能使用反射在对象中自动填充默认值

这是我一直在玩弄的一些代码,用于尝试懒惰地填充对象中的字段,主要用于 JUnit 中的对象工厂,但它可能是一种非常有用的方法。

在对象上运行此代码时,我们得到以下异常。

运行时出现异常 m.invoke(""); 在字符串设置器上。


为谷歌员工的利益更新了源代码。

0 投票
2 回答
751 浏览

java - guava-libraries - Ordering 类线程安全吗?

番石榴库有一个类Ordering。我想知道它是否是线程安全的。

例如,它可以用作静态变量吗?