java - 如何不给Guava的LoadingCache添加空值?

标签 java xml caching xpath guava

我必须使用 Guava 的 LoadingCache 将 xpath 表达式缓存为 xpath 值。

问题在于并非所有 xpath 都有值。大多数时候该值为null

代码片段:

private LoadingCache<String, List<String>> cachedXpaths = CacheBuilder.newBuilder()
        .expireAfterWrite(3, TimeUnit.MINUTES)
        .maximumSize(1000)
        .concurrencyLevel(5)
        .weakKeys()
        .build(new CacheLoader<String, List<String>>() {
            @Override
            public List<String> load(String key) throws Exception {
                return createListByKey(key);
            }
        });

private static List<String> createListByKey(String key) throws Exception {
    List<String> values = null;
    try {
        values = instance.getXpathValues(key);
    } catch (XPathExpressionException ignore) {
    }
    return values;
}

结果:

testEncounterSection(com.epam.cdatest.section.EncountersSectionTest)  Time elapsed: 0.002 sec  <<< FAILURE!
com.google.common.util.concurrent.UncheckedExecutionException: com.epam.cdatest.exceptions.XpathHasEmptyValueException
    at com.epam.cdatest.parsers.XpathEvaluator.getXpathValues(XpathEvaluator.java:123)
    at com.epam.cdatest.parsers.XpathEvaluator.createListByKey(XpathEvaluator.java:53)
    at com.epam.cdatest.parsers.XpathEvaluator.access$000(XpathEvaluator.java:32)
    at com.epam.cdatest.parsers.XpathEvaluator$1.load(XpathEvaluator.java:46)
    at com.epam.cdatest.parsers.XpathEvaluator$1.load(XpathEvaluator.java:43)

当xpath值为空时如何避免调用load()

最佳答案

如果你想区分空 List<String>和一个空值,因为 LoadingCache不支持空值,您可以使用 LoadingCache<String, Optional<List<String>>> :

private LoadingCache<String, Optional<List<String>>> cachedXpaths = CacheBuilder.newBuilder()
        .expireAfterWrite(3, TimeUnit.MINUTES)
        .maximumSize(1000)
        .concurrencyLevel(5)
        .weakKeys()
        .build(new CacheLoader<String, Optional<List<String>>>() {
            @Override
            public Optional<List<String>> load(String key) {
                try {
                    // If getXpathValues() can also return null, use fromNullable()
                    return Optional.of(instance.getXpathValues(key));
                } catch (XPathExpressionException | XpathHasEmptyValueException ignore) {
                    // Maybe log something here as well
                    return Optional.absent();
                }
            }
        });
<小时/>

更新:如果您不熟悉Optional ,有 JavadocWiki 中的一个页面,以及 Java 8 的所有文档,现在包含一个等效的类。

TL;DR 它是一个包装器,可以测试其内容是否存在:

Optional<List<String>> optionalXpaths = cachedXpaths.getUnchecked(str);
if (optionalXpaths.isPresent()) {
    List<String> xpaths = optionalXpaths.get();
    // Do something with xpaths
}

或者(但它更难看):

List<String> xpaths = cachedXpaths.getUnchecked(str).orNull();
if (xpaths != null) {
    // Do something with xpaths
}

关于java - 如何不给Guava的LoadingCache添加空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866746/

相关文章:

java - 无法部署 WAR : ClassNotFoundException - What am I still missing?

java - Android应用程序,无法引用非最终变量,但又不想将其设为最终变量

java - Android Studio Activity 登录屏幕不显示密码字段并且不显示用户名字段文本

caching - 在任何情况下,如何停止IIS缓存任何文件?

java - 在 Firefox 中停止缓存

java - 我如何获取字节数组的第一个 "n"元素并将它们直接转换为字符串?

java - 如何验证 Java ME 中 TextField 中的输入值

xml - 如何在 Eclipse 中禁用 Hibernate 3.0 XML 编辑器?

xml - 在 R 中解析 xml 文件及其元素

c++ - 为什么 OpenCL 工作组大小对 GPU 性能影响巨大?