标签: guava

在固定超时内缓存单个对象的最佳方法是什么?

Google Guava具有CacheBuilder,允许使用过期密钥创建ConcurrentHash,允许在固定tiemout之后删除条目.但是我只需要缓存某种类型的一个实例.

使用Google Guava在固定超时内缓存单个对象的最佳方法是什么?

java guava

54
推荐指数
1
解决办法
1万
查看次数

使用Google Guava的Objects.ToStringHelper

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()番石榴,而不是公共场所?

番石榴文件

java tostring guava

53
推荐指数
4
解决办法
5万
查看次数

如何使用Google集合将List <String>转换为Map <String,String>?

我有一个字符串列表,我有一个函数为列表中的每个键生成一个值.

我想用这个函数创建一个地图.我可以使用Google收藏吗?

java dictionary list guava

51
推荐指数
5
解决办法
6万
查看次数

google的ImmutableList和Collections.unmodifiableList()有什么区别?

来自ImmutableList javadocs:

与Collections.unmodifiableList(java.util.List)不同,后者是一个仍然可以更改的单独集合的视图,ImmutableList的实例包含其自己的私有数据,并且永远不会更改.ImmutableList方便公共静态最终列表("常量列表"),还可以让您轻松地为调用者提供给您的类的列表的"防御性副本".

这是否意味着:

  1. 如果我有Dimension对象的ImmutableList(例如),那么我不能更改其中的任何Dimension对象?
  2. 如果我有Dimension对象的Collections.unmodifiableList(列表),那么我不仅可以添加或删除任何对象,但我可以更改它们(例如调用setDimension(width,height)方法)?

java collections comparison guava

49
推荐指数
3
解决办法
2万
查看次数

获取基本类型的默认值

我手边有一个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,而不是一个默认的实例.

java reflection guava

49
推荐指数
4
解决办法
3万
查看次数

如果值为null,如何避免缓存?

我正在使用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.

那么,如何避免缓存空值?

caching guava

49
推荐指数
3
解决办法
4万
查看次数

从java8流创建番石榴MultiMap的最简洁方法

我有一个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.我错过了一个很好的"功能性"方式吗?

guava java-8 java-stream

48
推荐指数
2
解决办法
4万
查看次数

番石榴:如何结合过滤和转换?

我有一个字符串的集合,我想将它转换为字符串集合全部为空或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)

但是有没有一种将这两种行为合并为一步的番石榴方式?

java guava

47
推荐指数
1
解决办法
2万
查看次数

WeakHashMap是否有java.util.concurrent等价物?

是否可以使用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)

显然不行

java collections java.util.concurrent weakhashmap guava

46
推荐指数
2
解决办法
2万
查看次数

如何解决已存在的程序类型:com.google.common.util.concurrent.ListenableFuture?

我正在尝试使用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)

java android guava android-workmanager

46
推荐指数
3
解决办法
1万
查看次数