短路Java Optional.flatMap()

使用Java的import supervisor while True: if supervisor.runtime.serial_bytes_available: value = input().strip() # Sometimes Windows sends an extra (or missing) newline - ignore them if value == "": continue else: print(value) 是一个有趣的难题。我有一个以Optional.flatMap()"foo:bar"形式封装CURIE的类。我还有一个用于将前缀注册到名称空间以及跟踪默认名称空间的类。它有一个方法"bar"返回一个findnamespaceByPrefix()(因为前缀可能未注册)和一个方法Optional<URI>,也返回了一个getDefaultNamespace()(因为可能没有默认值)命名空间)。

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

Optional<URI>

但这是错误的。问题在于,即使有前缀但没有与该前缀关联的名称空间,它也会返回默认名称空间。如果CURIE中根本没有指定前缀,我们只想找回默认的名称空间。

这是一个解决方案:

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

我对此表示满意,但是使用三元运算符使我感到有些不正常,使用Optional<String> prefix = curie.getPrefix(); Optional<URI> namespace = prefix.isPresent() ? prefix.flatMap(this::findnamespaceByPrefix) : getDefaultNamespace(); 通常表示有更好的处理方法。

是否有任何Optional.isPresent()专家都拥有更好的,更实用的解决方案来“短路”平面映射? (我有一种预感,我可以使用管道中的OptionalOptionalOptional:of进行几层包装和展开Optional:get,但是也许还有一些更优雅的方法?)

nihao_123456 回答:短路Java Optional.flatMap()

而不是“ flatMapping”,您应该保留第二个可选级别:

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

map操作会将前缀(如果存在)映射到包装的Optional<Optional<URI>>中,该包装要么为空(如果没有前缀),要么包含一个Optional<URI>,或者为空(如果找不到前缀的名称空间)或包含实际名称空间。

只有在包装orElseGet为空并且因此没有前缀的情况下,才会调用外部Optional

,

您检查空前缀

Optional<URI> namespace = prefix
   .filter(Objects::nonNull)
   .flatMap(this::findNamespaceByPrefix)
   .or(this::getDefaultNamespace);

您可以如下进行测试:

    public static void main(String[] args) {
        test(Optional.ofNullable(null));
        test(Optional.ofNullable("yourprefix"));
    }

    private static void test(Optional<String> prefix) {
        Optional<URI> namespace2 = prefix
                .filter(Objects::nonNull)
                .flatMap(p -> Optional.of(URI.create(p)))
                .or(() -> Optional.of(URI.create("default")));

        System.out.println(namespace2);
    }
本文链接:https://www.f2er.com/3109117.html

大家都在问