问题标签 [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.
java - 以 Reader 身份打开 InputStream
我可以轻松转换InputStream
为BufferedReader
使用番石榴吗?
我正在寻找类似的东西:
我可以使用Files.newReader(File file, Charset charset)
. 这很酷,我想使用InputStream
.
更新:
使用CharStreams.newReaderSupplier
对我来说似乎很冗长。如果我错了,请纠正我,但为了轻松转换InputStream
为BufferedReader
使用 Guava,我必须这样做:
当然我可以创建助手做某事:
但是我认为 Guava IO 应该提供这样的帮助。我可以为 File 实例做这样的把戏。为什么我不能为 InputStream?
纠正我如果我错了,但在我看来就像缺少 API。
guava - 如何使用谓词从转换后的集合中删除元素?
如果我有一个ArrayList<Double> dblList
和一个Predicate<Double> IS_EVEN
,我可以从dblList
使用中删除所有偶数元素:
然而,如果dblList
是这样的转变的结果
这不再起作用,因为转换后的列表是不可变的:-)
有什么解决办法吗?
java - 计算地图:提前计算价值
现在我有一种情况,我知道可能会在接下来的几秒钟内查找特定的键。该密钥的计算成本也比大多数密钥高。
我想在最低优先级线程中提前计算该值,以便当最终请求该值时,它已经被缓存,从而提高了响应时间。
这样做的好方法是什么:
- 我可以控制执行计算的线程(特别是它的优先级)。
- 避免了重复工作,即计算只进行一次。如果计算任务已经在运行,则调用线程等待该任务而不是再次计算值(
FutureTask
实现这一点。使用 Guava 的计算映射,如果你只调用get
,但如果你将它与调用混合,则不是这样put
。) - “预先计算值”方法是异步的和幂等的。如果计算已经在进行中,它应该立即返回,而无需等待该计算完成。
- 避免优先级倒置,例如,如果一个高优先级线程请求该值,而一个中等优先级线程正在做一些不相关的事情,但计算任务在一个低优先级线程上排队,那么高优先级线程不能被饿死。也许这可以通过临时提高计算线程的优先级和/或在调用线程上运行计算来实现。
这如何在所有涉及的线程之间进行协调?
附加信息
我的应用程序中的计算是图像过滤操作,这意味着它们都受 CPU 限制。这些操作包括仿射变换(范围从 50µs 到 1ms)和卷积(最长 10ms)。当然,不同线程优先级的有效性取决于操作系统抢占较大任务的能力。
guava - 使用 MapMaker 创建缓存
我想使用 MapMaker 创建一个缓存大对象的地图,如果没有足够的内存,应该从缓存中删除。这个小演示程序似乎运行良好:
然而,当我在我的真实应用程序中做同样的事情时,条目基本上一被添加就从缓存中删除。在我的实际应用程序中,我也使用整数作为键,缓存值是从磁盘读取的包含一些数据的存档块。据我了解,弱引用一旦不再使用就会被垃圾收集,所以这似乎是有道理的,因为键是弱引用。如果我这样创建地图:
这些条目永远不会被垃圾收集,并且我的测试程序中出现内存不足错误。TestValue 条目上的 finalize 方法永远不会被调用。如果我将测试方法更改为以下内容:
从缓存中删除条目并调用 TestValue 对象的终结器,但过了一会儿我也得到了内存不足的错误。
所以我的问题是:使用 MapMaker 创建可用作缓存的地图的正确方法是什么?如果我使用weakKeys,为什么我的测试程序没有尽快删除条目?是否可以将引用队列添加到缓存映射?
java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器
我想从网络应用程序的各个地方收集一些指标。为简单起见,所有这些都是计数器,因此唯一的修饰符操作是将它们增加 1。
增量将是并发的并且经常发生。读取(转储统计信息)是一种罕见的操作。
我正在考虑使用ConcurrentHashMap。问题是如何正确增加计数器。由于地图没有“增量”操作,我需要先读取当前值,然后将其递增而不是将新值放入地图中。如果没有更多代码,这不是原子操作。
是否可以在不同步的情况下实现这一点(这会破坏ConcurrentHashMap的目的)?我需要看番石榴吗?
感谢您的任何指示。
PS
有一个关于SO(在Java中增加Map值的最有效方法)的相关问题,但专注于性能而不是多线程
更新
对于那些通过搜索同一主题到达这里的人:除了下面的答案之外,还有一个有用的演示文稿,顺便涵盖了同一主题。见幻灯片 24-33。
java - 谷歌番石榴和我无法弄清楚的错误
尝试编译时出现此错误:
Iterables 类型中的方法filter(Iterable<T>, Predicate<? super T>)
不适用于参数 ( Iterator<PeopleSoftBalance>, ColumnLikePredicate<PeopleSoftBalance>
)
这是 ColumnLikePredicate 类信号:
我究竟做错了什么?
java - IllegalAnnotationsException SetMultimap 是一个接口,而 JAXB 无法处理接口
我有以下代码:
这给了我以下例外。
我的问题是,为什么这不起作用,但这样做:
以及如何修复 SetMultimap 以使 JAXB 满意?
java - Guava ForwardingList 使用示例
我正在寻找解释 Guava ForwardingList 类的示例代码。基本上,我正在实现一个自定义 ArrayList 类,该类将用于解决我之前的 SO 问题中提到的这个要求。我以前从未使用过谷歌收藏。但是通过查看ForwardingList 的 JavaDoc,我想我可以通过子类 ForwardingList 来实现我的自定义类。
java - 尽可能使用反射在对象中自动填充默认值
这是我一直在玩弄的一些代码,用于尝试懒惰地填充对象中的字段,主要用于 JUnit 中的对象工厂,但它可能是一种非常有用的方法。
在对象上运行此代码时,我们得到以下异常。
运行时出现异常 m.invoke(""); 在字符串设置器上。
为谷歌员工的利益更新了源代码。