【问题标题】:Java8 : Can't get value of an Optional.of(String) return typeJava8:无法获取 Optional.of(String) 返回类型的值
【发布时间】:2022-01-19 20:01:11
【问题描述】:

在使用 OWLAPI 4.0 API 的上下文中,以下代码行: ontologyIRI = IRI.create(o.getOntologyID().getOntologyIRI().toString());

返回以下字符串: "Optional.of(http://www.indytion.com/music/composition)".

我需要的是唯一的字符串“http://www.indytion.com/music/composition”。

我尝试将 ontologyIRI 声明为 Optional 并使用 .get() 方法、.orElse() 等无济于事。我仍然有包含 'optional.of()' 部分的返回字符串。

我的问题是:如何获取内部字符串?

非常感谢您的帮助。

编辑:方法的完整代码

    private void LoadOntology(String ontologyPath)
    {
        OWLOntologyManager man = OWLManager.createOWLOntologyManager();
        OWLOntology o;

        File ontologyFile = new File(ontologyPath);
        Optional<IRI> ontologyIRI;
        try {

            o = man.loadOntologyFromOntologyDocument(ontologyFile);
            ontologyIRI = Optional.of(IRI.create(String.valueOf(o.getOntologyID().getOntologyIRI()).toString()));
            System.out.println("Ontology IRI is: " + ontologyIRI.get());
        } catch (OWLOntologyCreationException e) {
            e.printStackTrace();
        }
    }

The System.out.println() returns exactly this string:
"Ontology IRI = Optional.of(http://www.indytion.com/music/composition)"

【问题讨论】:

  • 请更明确地说“无济于事”:显示您的代码是什么样的,它做了什么或为什么不能运行它。 .get().orElse() 都应该可以工作。
  • o.getOntologyID().getOntologyIRI() 是否返回 Optional
  • @JoachimSauer 我相信 OP 从响应中得到Optional.of(http://www.indytion.com/music/composition) 逐字作为字符串。
  • 这是一种猜测,但由于 IRI.create 被记录为返回 IRI,因此如果它返回该文字字符串,那么就出现了问题。这就是为什么 OP 应该真正向我们展示一些代码,而不仅仅是描述代码。
  • 很难说 OP 到底在用什么,但如果是 this getOntologyIRI() 那么整个 IRI.create(o.getOntologyID().getOntologyIRI().toString()) 就完全没有意义了,因为 o.getOntologyID().getOntologyIRI().get() 就足够了

标签: java optional owl-api


【解决方案1】:

使用 .get() 代替 toString()

//Returns 'Optional[example]'
Optional.of("example").toString();
    
//Returns 'example'
Optional.of("example").get();

【讨论】:

  • 我试过.get(),但是返回的字符串还是“Optional.of(...)”。
【解决方案2】:

简答:替换

Optional.of(IRI.create(String.valueOf(o.getOntologyID().getOntologyIRI()).toString()));

o.getOntologyID().getOntologyIRI().get();

更长的答案:你正在做大量的来回操作,这充其量是毫无意义的,并且在某些情况下是有害的:

不分先后:

  • 其他人已经评论说IRI 实例是不可变的,因此从现有实例创建新实例是毫无意义的(如果无害的话)。
  • 如果您不打算实际返回 Optional,则调用 Optional.of() 几乎总是一个坏主意。
  • String.valueOf() 用于获取某个值的字符串表示,通常对调试最有用,但不应依赖于完全往返有关对象的所有内容(同样适用于 @ 987654328@.

所以基本上你剩下的就是:

  1. o.getOntologyID().getOntologyIRI() 给你一个Optional&lt;IRI&gt;
  2. 你想要IRI
  3. Optional::get 返回可选值中包含的值,如果存在,则只需调用get()

如果Optional 为空(即没有基础值),那么get() 将抛出NoSuchElementException。这可能是也可能不是您想要的。要解决此问题,请在调用 get() 之前调用 isPresent() 以检查值是否存在,或使用众多其他访问器方法中的任何一种,其中一些在某种程度上具有“内置检查”。

【讨论】:

  • 我只是注意到 OWLAPI 方法 ...create() 返回一个@Nonnull public com.google.common.base.Optional。由于我不知道这两个类(Java.util.Optional / com.google.common.base.Optional)之间的区别,我会进一步调查并在必要时再次询问。感谢您的时间和帮助。
  • OWLAPI 4 在 java 8 之前发布,所以谷歌版本的 Optional 是唯一可用的。 OWLAPI 5 使用 java.util.Optional。
  • 这些可选类型之间没有相关区别。如果您知道它不为空,请致电get()。作为旁注,String.valueOf(…).toString() 比这个答案所说的更没有意义。它甚至没有来回做......
【解决方案3】:

最后,问题似乎不在于代码本身。问题就是这样解决的。但我不明白为什么它已经解决了:

  1. 我从 OWLAPI4 示例中复制/粘贴(在同一文件中)“shouldAddObjectPropertyAssertions()”示例 -> 此示例代码运行正常(但不像我那样使用 getOntologyID() 方法)。
  2. 将 SDK 更改为另一个次要版本“1.8.0_61”
  3. 使用初始和所需的 SDK '1.8.0_131'再次更改
  4. 使缓存无效并重新启动 IDE

问题解决了。完全相同的代码:

ontologyIRI = o.getOntologyID().getOntologyIRI().get();
System.out.println("Ontology IRI is: " + ontologyIRI);

现在返回预期的字符串值:“http://www.indytion.com/music/composition”而不是“Optional.of(http://www.indytion.com/music/composition)”。

如果有人能解释为什么它已被修复,我会很高兴。

再次感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多