gpt4 book ai didi

java - 短路 Java Optional.flatMap()

转载 作者:行者123 更新时间:2023-11-30 06:40:08 24 4
gpt4 key购买 nike

这里有一个有趣的难题,使用 Java 的 Optional.flatMap() .我有一个封装了 CURIE 的类形式为 "foo:bar"或者只是 "bar" .我还有一个类用于将前缀注册到 namespace ,以及用于跟踪默认 namespace 。它有一个方法 findNamespaceByPrefix()返回 Optional<URI> (因为前缀可能未注册)和方法 getDefaultNamespace() , 也返回 Optional<URI> (因为可能没有默认命名空间)。

给定一些 CURIE,我想找到命名空间。使用这个很诱人:

Optional<URI> namespace = curie.getPrefix()
.flatMap(this::findNamespaceByPrefix)
.or(this::getDefaultNamespace);

但这是错误的。问题是它返回默认 namespace ,即使有前缀但没有 namespace 与该前缀相关联。如果 CURIE 中根本没有指示前缀,我们只想取回默认命名空间(如果有的话)。

解决方法:

Optional<String> prefix = curie.getPrefix();
Optional<URI> namespace = prefix.isPresent()
? prefix.flatMap(this::findNamespaceByPrefix)
: getDefaultNamespace();

我对此很满意,但我觉得它在使用三元运算符和使用 Optional.isPresent() 时有点不起作用。通常表示有更好的方法来做事。

做任何Optional专家们有更好、更实用的解决方案来“短路”平面映射吗? (我有一种预感,我可以通过在管道中使用 OptionalOptional:of 进行多层包装和展开 Optional:get 来做一些事情,但是有没有更优雅的东西?)

最佳答案

而不是“flatMapping”你应该保留你的第二级可选:

Optional<URI> namespace = curie.getPrefix()
.map(Application::findNamespaceByPrefix)
.orElseGet(Application::getDefaultNamespace);

map操作将前缀(如果存在)映射到包装的 Optional<Optional<URI>> 中。那是空的(如果前缀不存在)或包含 Optional<URI>它要么是空的(如果找不到前缀的命名空间),要么包含实际的命名空间。

和外层orElseGet仅在包装 Optional 时被调用为空,因此您的前缀不存在。

关于java - 短路 Java Optional.flatMap(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58839663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com