FindFirst 和 orElse 运算符返回不同的类类型

pau*_*aul 0 groovy java-8 java-stream

I\xc2\xb4m 使用 Stream 并findFirst()返回Optional,但也有 \xc2\xb4s 有可能我的StreamMaybe 不会发出任何东西,所以我添加了orElse在底部添加了运算符。

\n

问题是orElse不返回可选值,而是返回可选值的类类型findFirst

\n
        def optional = categories.categories.stream()\n                .filter { category -> category.name == selCategory }\n                .map { category -> loadUniqueIds.call(category) }\n                .map { UUIDs -> new JsonArray(UUIDs) }\n                .findFirst().orElse{Optional.of(new JsonArray())}\n        optional.get()\n
Run Code Online (Sandbox Code Playgroud)\n

所以我最终无法使用findFirst并且orElse

\n

我\xc2\xb4m在这里做错了什么?

\n

谢谢

\n

更新:

\n

我最终删除了orElse之后findFirst并稍后检查可选的

\n
        optional.isPresent() ? optional.get(): new JsonArray()\n
Run Code Online (Sandbox Code Playgroud)\n

无论如何,如果有人有更好/优雅的解决方案,请告诉我。

\n

问候。

\n

Kay*_*man 5

如果你使用findFirst()你会得到一个Optional,但是如果你使用orElse()(这是Optional的方法)你会得到未包装的对象,因为你无法Optional再得到一个。要么获取findFirst()unwrapped中找到的内容,要么获取 中的“默认”值orElse()

从 中返回一个可选值是没有意义的orElse(),因为它总是保证存在。

Optional.of("foo").orElse("bar");  // Returns String "foo"
Optional.empty().orElse("bar");    // Returns String "bar"
Run Code Online (Sandbox Code Playgroud)