Java 咖啡因的用途';s生成器函数参数?

Java 咖啡因的用途';s生成器函数参数?,java,caffeine,Java,Caffeine,我是新来的,很明显我错过了一些超基本的东西。我看到的所有基本用法示例如下所示: LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder() .maximumSize(100) .expireAfterWrite(10, TimeUnit.DAYS) .build(k -> fetchFizzbuzzes()); LoadingCache FizzBuzzs=caffee.newBui

我是新来的,很明显我错过了一些超基本的东西。我看到的所有基本用法示例如下所示:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(k -> fetchFizzbuzzes());
LoadingCache FizzBuzzs=caffee.newBuilder()
.最大尺寸(100)
.expireAfterWrite(10,时间单位:天)
.build(k->fetchfizzbuzzs());
我正在努力解决的是
fetchfizzbuzzs()
函数所扮演的角色:

  • 它是否用于填充初始缓存
  • 在缓存中不存在密钥的情况下,它是否用作某种回退
  • 还有别的吗

实际上,这是建筑商最重要的部分。传递给
build(CacheLoader)
方法的函数接受一个键并计算该键的值。如果缓存中当前没有该键的值,则调用此函数。计算出的值将随后添加到缓存中。还有一个不带参数的
build()
方法,如果要手动检查缓存中是否存在元素并手动添加元素,可以使用该方法

但是,您的示例没有太多意义,因为
fetchfizzbuzzs()
方法没有参数。也就是说,如果没有副作用,它可能会为所有键
k
返回相同的值

举例如下:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(key -> fetchFizzbuzzes(key));
fizzbuzzes.get("myKey"); // will automatically invoke fetchFizzbuzzes with 'myKey' as argument
fizzbuzzes.get("myKey"); // fetchFizzbuzzes won't be called as return value from previous call is added to the cache automatically


Cache<String, Fizzbuzz> fizzbuzzesManual = Caffeine.newBuilder()
     .maximumSize(100)
     .expireAfterWrite(10, TimeUnit.DAYS)
     .build();
fizzbuzzesManual.getIfPresent("myKey"); // will return null as no element for 'myKey' was added to the cache before
LoadingCache FizzBuzzs=caffee.newBuilder()
.最大尺寸(100)
.expireAfterWrite(10,时间单位:天)
.build(key->fetchfizzbuzzs(key));
嘶嘶作响。获取(“我的钥匙”);//将以“myKey”作为参数自动调用FetchFizzBuzzs
嘶嘶作响。获取(“我的钥匙”);//FetchFizzBuzzs不会被调用,因为上一次调用的返回值会自动添加到缓存中
Cache fizzbuzzsmanual=Caffeine.newBuilder()
.最大尺寸(100)
.expireAfterWrite(10,时间单位:天)
.build();
FizzBuzzsmannual.getIfPresent(“myKey”);//将返回null,因为之前没有将“myKey”的元素添加到缓存中

有关更多详细信息,请参阅。

谢谢@dpr(+1)-如果密钥不在缓存中,是否可以将咖啡因配置为只返回
null
?换句话说,如果我没有一个好方法(或者不想)自动获取一个不在缓存中的值,该怎么办?再次感谢@热肉丸子汤,看我的编辑。我认为,如果传递给build方法的函数返回
null
,这将被解释为“无法计算值”,下次尝试获取同一个键的值时,将再次调用该函数,由于该值未存储在缓存中。感谢编辑@dpr,但当我尝试使用no arg
build()
method:
不兼容的类型时,实际上会出现编译错误。需要LoadingCache,但已将“build”推断为缓存;不存在变量K1,V1类型的实例,因此缓存符合LoadingCache
。。。有什么想法吗?!再次非常感谢@hotmeatballsoup,
build()
不带参数只返回一个
Cache
其中
build(CacheLoader)
返回一个
LoadingCache
。我在回答中也解决了这个问题。是的,我也看到了这个。对于未加载的
缓存
,它是
getIfPresent(键)