Tag: 番石榴

Javagenerics通配符问题

在使用Google Guava优秀的Multimap时,我遇到了Generics的一些问题。 我有一个类型Handler定义为这样 public interface Handler { void handle(T t); } 在另一个类中,我定义了一个将String映射到Handlers集合的多图。 private Multimap<String, Handler> multimap = ArrayListMultimap.create(); 现在,当我尝试使用multimap时,我遇到了编译器错误。 我的第一次尝试看起来像这样: public void doStuff1(String s, T t) { Collection<Handler> collection = multimap.get(s); for (Handler handler : collection) { handler.handle(t); } } 这导致以下错误。 Type mismatch: cannot convert from Collection<Handler> to Collection<Handler> 之后,我试着像这样编码 public void doStuff2(String s, Serializable […]

将超类合并到Guava Objects.hashcode()实现的正确方法?

可能是一个愚蠢的问题,但我不想搞砸了。 假设我有两个Java类, Class1和Class2 ,其中Class2 extends Class1 。 我想使用Guava为两个类重写Object.hashcode() 。 对于超类,我有 @Override public int hashCode() { return Objects.hashcode(mField1, mField2); } 对于Class2,实现hashcode()的正确方法是什么,将Class1的成员考虑在内? 是这样的吗? @Override public int hashcode() { return Objects.hashcode(super.hashcode(), mField3, mField4); } SEEMS对我而言,但我正在寻找一些validation。 Joshua Bloch没有在Effective Java中解决这种情况,而Guava文档也没有。

Google Collections ImmutableMap迭代顺序

我需要Google Collection ImmutableMap和LinkedHashMap组合 – 具有定义的迭代顺序的不可变映射。 似乎ImmutableMap本身实际上已经定义了迭代顺序,至少它的文档说 : 基于散列的不可变Map,具有可靠的用户指定迭代顺序。 但是没有更多细节。 快速测试表明这可能是真的,但我想确定。 不幸的是,快速浏览一下这些消息来源对我没什么帮助。 我的问题是:我可以依赖ImmutableMap的迭代顺序吗? 如果我执行ImmutableMap.copyOf(linkedHashMap) ,它是否与原始链接哈希映射具有相同的迭代顺序? 构建器创建的不可变映射怎么样? 一些权威答案的链接会有所帮助,因为谷歌没有找到任何有用的东西。 (不,与来源的链接不计算在内)。

将List转换并转换为使用Guava进行设置

有没有一种简单的方法来转换和转换列表与番石榴设置? 我想用方法: Set result = Sets.transformToSet(myList, new Function() { public To apply(From item) { return convert(item); } }); 这是我的代码,带有“tempCollection” Collection tempCollection = Collections2.transform(myList, new Function() { public To apply(From item) { return convert(item); } }); Set result = newHashSet(tempCollection );

Guava Charmatcher静态初始化缓慢

更新:看起来我的13.0.1正在调用来自这个差异化CharMatcher的代码。 http://code.google.com/p/guava-libraries/source/diff?spec=svn69ad96b719d7cd3d872a948d7454f17b816a21c2&r=464b0cfab7c3b6713c35e6f3ae7426542668c77b&format=side&path=/guava/src/com/google/common/base/CharMatcher.java 我似乎遇到了番石榴的Charmatcher的问题。 我目前正在编写一些JUnit测试,我注意到第一次测试花费了一些时间(15+秒),但未来的测试大致相同(.3秒),大多数测试都在同一个测试中运行码。 我对代码的分析表明,Guava图书馆中的Charmatcher似乎是罪魁祸首。 看起来CharMatcher中有一些静态初始化代码可能是它花费这么长时间的真正原因。 有什么办法可以禁用或优化这种行为吗? 维基页面或帮助文件中是否存在我遗漏的内容? Guava版本13.0.1,系统:Linux 64,Eclipse 3.6.1 编辑:我用以下代码构建了一个测试应用程序: import com.google.common.base.CharMatcher; public class Main { public static void main(String[] args) { // Using system instead of stopwatch to isolate library. long startTime = System.currentTimeMillis(); CharMatcher.is(‘ ‘); long endTime = System.currentTimeMillis(); System.out.println(“took ” + String.valueOf(endTime-startTime) + ” ms”); startTime = System.currentTimeMillis(); CharMatcher.is(‘d’); endTime […]

预加载番石榴缓存的值

我有一个要求,我们从数据库加载静态数据以便在Java应用程序中使用。 任何缓存机制都应具有以下function: 从数据库加载所有静态数据(加载后,此数据不会更改) 从数据库加载新数据(启动时数据库中的数据不会改变,但可以添加新数据) 延迟加载所有数据不是一种选择,因为应用程序将部署到多个地理位置,并且必须与单个数据库通信。 如果应用程序位于与数据库不同的区域,则延迟加载数据将使对特定元素的第一个请求太慢。 我一直在使用Guava中的MapMaker API成功但我们现在正在升级到最新版本,我似乎无法在CacheBuilder API中找到相同的function; 我似乎无法找到一种在启动时加载所有数据的简洁方法。 一种方法是从数据库加载所有密钥并分别通过缓存加载。 这可以工作,但会导致对数据库的N + 1调用,这不是我正在寻找的有效解决方案。 public void loadData(){ List keys = getAllKeys(); for(String s : keys) cache.get(s); } 或者另一个解决方案是使用ConcurrentHashMap实现并自己处理所有线程和缺少的条目? 我并不热衷于这样做,因为MapMaker和CacheBuilder API免费提供基于密钥的线程锁定,而无需提供额外的测试。 我也很确定MapMaker / CacheBuilder的实现会有一些我不知道/没有时间调查的效率。 public Element get(String key){ Lock lock = getObjectLock(key); lock.lock(); try{ Element ret = map.get(key) if(ret == null){ ret = getElement(key); // database […]

Trie节省空间,但如何?

我很困惑Trie实现如何以最紧凑的forms节省空间并存储数据! 如果你看下面的树。 在任何节点上存储字符时,还需要存储对该字符的引用,因此对于存储其引用所需的字符串的每个字符。 好的,当一个普通角色到达时我们节省了一些空间,但是在存储对该角色节点的引用时我们失去了更多空间。 那么维护这棵树本身不是很多结构开销吗? 相反,如果使用TreeMap代替这个,让我们说实现一个字典,这可以节省更多的空间,因为字符串将被保存在一个片段中因此没有浪费存储引用的空间,不是吗?

在Google Guava(Java)中,为什么Iterables.getFirst()和getLast()不一致?

来自Google Guava JavaDoc for Iterables : static T getFirst(Iterable iterable, T defaultValue) – >如果iterable为空,则返回iterable或defaultValue中的第一个元素。 static T getLast(Iterable iterable) – >返回iterable的最后一个元素。 static T getLast(Iterable iterable, T defaultValue) – >如果iterable为空,则返回iterable或defaultValue的最后一个元素。 缺少一种静态方法(对我而言): static T getFirst(Iterable iterable) – >返回iterable的第一个元素。 你知道这种不一致的原因吗?

Guava:如何从List和单个元素创建显式排序?

在Guava中,如果我知道Collection和Collection类型的元素e在集合中,我想创建一个自定义Ordering ,首先对e进行排序,然后对集合的其余部分进行排序。 然而,到达那里的方式似乎非常复杂: Collection values = ImmutableList.of(“apples”, “oranges”, “pears”); String first = “oranges”; List remainingValues = newArrayList(values); // this remainingValues.remove(first); // seems Ordering myOrdering = // very Ordering.explicit(first, remainingValues.toArray( // complicated! new String[remainingValues.size()])); // is there an easier way? 我想要的是这样的事情: Ordering.explicit(first); (我希望这首先排序到开头并保留所有其他元素的顺序,但是文档说生成的Ordering会为未明确列出的元素抛出ClassCastException 。) 或者像这样: Ordering.explicit(first, values.toArray(/* etc */)); (但这会失败,因为first是重复值) 有人能想出一个简洁的方法来做我想做的事吗? 顺便说一句,它不一定是一个Ordering ,它也可能是在指定的Order中创建Iterable一种解决方法,但同样,这非常复杂: Iterable sorted = […]

ArrayListMultimap与LinkedListMultimap有何不同?

所以,我只是读取了ArrayListMultimap和LinkedListMultimap的javadoc,以便了解如何使用它们,我发现它们都支持重复的键值对(并且我的意思是相同的键,不同的值 – 如果我理解正确的话。如果我错了,请纠正我)。 但是,我不明白它们之间的区别。 两者都用于存储重复的键值对。 它们不同的唯一部分是它们的实现,即ArrayListMultimap是作为Array实现的,而LinkedListMultimap是作为LinkedList实现的? 另外,它们在性能上有何不同? 我知道我问了很多,但我真的不知道在哪里可以找到答案。