Tag: 番石榴

Google Collections(Guava Libraries):ImmutableSet / List / Map and Filtering

假设您要构建ImmutableSet / List / Map对象的副本,但过滤掉一些原始条目。 实现这一目标的一种方法如下: ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS)); 其中myObject.EQUALS是Iterables.filter()操作的谓词。 我认为这是一个非常优雅且易于阅读的实现。 但是,一个构建两个列表对象(首先通过Iterables.filter(…)调用,第二个通过ImmutableList.copyOf(…) )这是非常低效的。 有人知道更有效的方法吗? 我想最好的办法是将过滤谓词添加到ImmutableSet / List / Map构建器中,这样对象必须只构造一次。 但不幸的是,没有这样的参数。

使用com.google.common.base.Splitter时出现NoSuchMethodErrorexception

我正在尝试使用com.google.common.base.Splitter,如下所示 Iterable segs = Splitter.on(“/”).split(“one/two/three/four/five”); for (String seg : segs) { System.out.println(seg); } 但是,我看到以下exception: Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Platform.precomputeCharMatcher(Lcom/google/common/base/CharMatcher;)Lcom/google/common/base/CharMatcher; at com.google.common.base.CharMatcher.precomputed(CharMatcher.java:664) at com.google.common.base.CharMatcher.(CharMatcher.java:71) at com.google.common.base.Splitter.(Splitter.java:107) at com.google.common.base.Splitter.on(Splitter.java:171) at Test.main(Test.java:30) 有谁知道我在这里做错了什么?

ConcurrentHashMap等待密钥可能吗?

我有multithreading的沟通。 1线程正在将数据分派给其他线程。 主线程正在推送数据: 主线程:ConcurrentHashMap map = Global.getInstance()。getMap(); //将数据推送到其他一些线程map.put(1,“Test”); 线程1:字符串数据= map.get(1); //直接返回null,但我想等到推送数据 如果主线程没有推送任何数据,则线程1返回null。 但我想等到有数据,我该怎么办? TransferQueue不是我当前实现的好方法。 我必须使用ConcurrentHashMap。 有人知道任何解决方案吗?

有没有办法连接字符串,每个字符串都有一个特定的周围字符串?

我希望使用guava的Joiner将List到一个字符串中,但是在列表中的每个字符串周围都有周围的字符串。 所以我想列出一个字符串列表: List names = Arrays.asList(“John”, “Mary”, “Henry”); 并生成这一个字符串: “your guest John is here, your guest Mary is here, your guest Henry is here” 我看到使用Joiner的例子似乎是生成用逗号分隔的3个名字,但我希望用一些额外的字符串(每次都是相同的)包围每个字符串。 我希望我在这里足够清楚。 谢谢你的帮助。

番石榴的RateLimiter每分钟而不是秒?

我试图限制用户可以使用我的REST API创建的帐户数量。 我本来希望使用Guava的RateLimiter只允许IP在10分钟内创建5个帐户,但RateLimiter.create方法只需要一个double指定许可数“每秒”。 有没有办法配置RateLimiter以大于一秒的粒度释放许可?

如何避免在番石榴中使用lalsily Lists.transform?

Map map = Maps.newHashMap(); map.put(“test”,”123″); map.put(“fuyou001″,”456”); map.put(“id”,145); List<Map> list = Lists.newArrayList(); list.add(map); Lists.transform(list, new Function<Map, Object>() { @Override public Object apply(@Nullable Map input) { System.out.println(“test:” + input); return input; } }); System.out.println(list);` 控制台不显示“test ….” 如何避免懒惰应用 我也试试 List<Map> newList = new ArrayList<Map>(list.size()); Collections.copy(newList,list); 但没有效果

在Google Guava中打印HashBasedTable的所有键和值

我使用以下代码创建并填充Guava Table : Table table = HashBasedTable.create(); table.put(“A”, “B”, 1); table.put(“A”, “C”, 2); table.put(“B”, “D”, 3); 我想知道如何迭代表并打印每行的键和值? 所以,期望的输出是: AB 1 AC 2 BD 3

Guava ImmutableList copyOf vs Builder

我想知道哪个更有效率,为什么? 1) List foo; … return ImmutableList.copyOf(foo); 要么 2) List foo; … return new ImmutableList.Builder().addAll(foo).build();

是否有JDK或Guava方法将null转换为空列表?

在JDK或Google Guava中是否有像这样的方法 public static Collection safe(Collection collection) { if (collection == null) { return new ArrayList(0); } else { return collection; } } 例如,如果某些东西返回空列表,则很容易在增强的循环上崩溃 for (String string : CollectionUtils.safe(foo.canReturnANullListOfStrings())) { // do something } 不会崩溃。 我环顾四周但找不到任何这样的方法,我想知道我是否错过了它,或者是否有理由为什么这样一个方便的方法不方便因此不包括在内?

可靠地迫使番石榴地图被驱逐

编辑:我重新组织了这个问题,以反映自那以后可用的新信息。 这个问题是基于对Viliam关于Guava Maps使用懒惰驱逐的问题的回答:Guava地图中的驱逐懒惰 请首先阅读这个问题及其回答,但基本上结论是,番石榴地图不会异步计算并强制执行驱逐。 给出以下地图: ConcurrentMap cache = new MapMaker() .expireAfterAccess(10, TimeUnit.MINUTES) .makeMap(); 在访问条目后十分钟过后,在再次“触摸”地图之前,它仍然不会被驱逐。 已知的方法包括常用的访问器 – get()和put()以及containsKey() 。 问题的第一部分[已解决]:其他调用会导致地图被“触摸”? 具体来说,有没有人知道size()属于这一类? 想知道这一点的原因是我已经实现了一个计划任务来偶尔轻推我用于缓存的Guava地图,使用这个简单的方法: public static void nudgeEviction() { cache.containsKey(“”); } 但是我也使用cache.size()以编程方式报告地图中包含的对象数量,以此确认此策略是否正常工作。 但我无法看到这些报告的差异,现在我想知道size()也会导致驱逐。 答:因此Mark指出在第9版中,只有get() , put()和replace()方法get()调用驱逐,这可以解释为什么我没有看到containsKey()的效果。 这显然会随着即将发布的下一版番石榴而改变,但遗憾的是我的项目发布时间越早。 这让我陷入了一个有趣的困境。 通常我仍然可以通过调用get(“”)来触摸地图,但我实际上正在使用计算地图: ConcurrentMap cache = new MapMaker() .expireAfterAccess(10, TimeUnit.MINUTES) .makeComputingMap(loadFunction); 其中loadFunction从数据库加载与该键对应的MyObject 。 它开始看起来像我没有简单的方法强迫驱逐直到r10。 但是,即使能够可靠地强制驱逐,我的问题的第二部分仍然存在疑问: 我的问题的第二部分[已解决]: 针对相关问题的其中一个回复 ,是否触摸地图可靠地逐出所有过期的条目? 在链接的答案中, Niraj Tolia另有说明,称驱逐可能只是分批处理,这意味着可能需要多次触摸地图以确保所有过期的对象被驱逐。 他没有详细说明,但这似乎与基于并发级别的地图被拆分成相关。 […]