Google Guava具有CacheBuilder,允许使用过期密钥创建ConcurrentHash,允许在固定tiemout之后删除条目.但是我只需要缓存某种类型的一个实例.
使用Google Guava在固定超时内缓存单个对象的最佳方法是什么?
我ToStringBuilder.reflectionToString(class)在commons-lang中用来实现toString()简单的DTO.现在我正在尝试使用Google Guava而不是Apache commons库.我Objects.ToStringHelper在瓜瓦找到了.但如果班上有很多成员,那就太啰嗦了.例如:
@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass()).add("name", name)
.add("emailAddress", emailAddress)
.add("department", department).add("yearJoined", yearJoined)
.toString();
}
Run Code Online (Sandbox Code Playgroud)
如果我使用commons-lang则更简单:
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来实施toString()番石榴,而不是公共场所?
我有一个字符串列表,我有一个函数为列表中的每个键生成一个值.
我想用这个函数创建一个地图.我可以使用Google收藏吗?
来自ImmutableList javadocs:
与Collections.unmodifiableList(java.util.List)不同,后者是一个仍然可以更改的单独集合的视图,ImmutableList的实例包含其自己的私有数据,并且永远不会更改.ImmutableList方便公共静态最终列表("常量列表"),还可以让您轻松地为调用者提供给您的类的列表的"防御性副本".
这是否意味着:
我手边有一个Java原始类型:
Class<?> c = int.class; // or long.class, or boolean.class
Run Code Online (Sandbox Code Playgroud)
我想获得此类的默认值 - 具体而言,如果未初始化该值,则将该值分配给此类型的字段.例如,0对于数字,false对于布尔值.
有没有通用的方法来做到这一点?我试过这个:
c.newInstance()
Run Code Online (Sandbox Code Playgroud)
但我得到的是一个InstantiationException,而不是一个默认的实例.
我正在使用guava来缓存热数据.当缓存中不存在数据时,我必须从这样的数据库中获取它.
public final static LoadingCache<ObjectId, User> UID2UCache = CacheBuilder.newBuilder()
//.maximumSize(2000)
.weakKeys()
.weakValues()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(
new CacheLoader<ObjectId, User>() {
@Override
public User load(ObjectId k) throws Exception {
User u = DataLoader.datastore.find(User.class).field("_id").equal(k).get();
return u;
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是当数据在数据库中也不存在时,我宁愿返回null而不做任何缓存.但是guava只是在缓存中使用密钥保存null并在我得到它时抛出异常
com.google.common.cache.CacheLoader $ InvalidCacheLoadException:CacheLoader为key shisoft返回null.
那么,如何避免缓存空值?
我有一个List<Foo>并且想要一个Multimap<String, Foo>我们Foo根据他们的getId()功能对其进行分组的地方.
我正在使用Java 8,它几乎可以做到:
List<Foo> foos = ...
Map<String, List<Foo>> foosById = foos.stream().collect(groupingBy(Foo::getId));
Run Code Online (Sandbox Code Playgroud)
但是,我有大量的代码需要一个,MultiMap<String, Foo>所以这并没有为我节省任何东西,我回到使用for循环来创建我的MultiMap.我错过了一个很好的"功能性"方式吗?
我有一个字符串的集合,我想将它转换为字符串集合全部为空或null删除字符串,其他所有字符串都被修剪.
我可以分两步完成:
final List<String> tokens =
Lists.newArrayList(" some ", null, "stuff\t", "", " \nhere");
final Collection<String> filtered =
Collections2.filter(
Collections2.transform(tokens, new Function<String, String>(){
// This is a substitute for StringUtils.stripToEmpty()
// why doesn't Guava have stuff like that?
@Override
public String apply(final String input){
return input == null ? "" : input.trim();
}
}), new Predicate<String>(){
@Override
public boolean apply(final String input){
return !Strings.isNullOrEmpty(input);
}
});
System.out.println(filtered);
// Output, as desired: [some, stuff, here]
Run Code Online (Sandbox Code Playgroud)
但是有没有一种将这两种行为合并为一步的番石榴方式?
是否可以使用Collections.synchronizedMap()并发保持正确性来重写下面的代码片段?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
Run Code Online (Sandbox Code Playgroud)
即是否可以使用java.util.concurrent中的东西?请注意,仅替换为
new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
Run Code Online (Sandbox Code Playgroud)
显然不行
我正在尝试使用WorkManager 1.0.0-alpha09.我收到此错误:
Program type already present:
com.google.common.util.concurrent.ListenableFuture
Message{kind=ERROR, text=Program type already present:
com.google.common.util.concurrent.ListenableFuture, sources=[Unknown source
file], tool name=Optional.of(D8)}
Run Code Online (Sandbox Code Playgroud)
如果我使用版本1.0.0-alpha08或更少.我没有得到这个错误,但我需要公共构造函数
public Worker(Context context, WorkerParameters workerParams)
Run Code Online (Sandbox Code Playgroud) guava ×10
java ×8
collections ×2
android ×1
caching ×1
comparison ×1
dictionary ×1
java-8 ×1
java-stream ×1
list ×1
reflection ×1
tostring ×1
weakhashmap ×1