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

Groovy FindFirst和orElse运算符返回不同的类类型,groovy,java-8,java-stream,Groovy,Java 8,Java Stream,我将流与findFirst()一起使用,它返回可选,但也有可能我的流可能不会发出任何东西,因此我在底部添加了orElse操作符 问题是,orElse不返回可选的类类型,而是可选的findFirst运算符包装的类类型 def optional = categories.categories.stream() .filter { category -> category.name == selCategory }

我将流与
findFirst()
一起使用,它返回
可选
,但也有可能我的
可能不会发出任何东西,因此我在底部添加了
orElse
操作符

问题是,
orElse
不返回可选的类类型,而是可选的
findFirst
运算符包装的类类型

        def optional = categories.categories.stream()
                .filter { category -> category.name == selCategory }
                .map { category -> loadUniqueIds.call(category) }
                .map { UUIDs -> new JsonArray(UUIDs) }
                .findFirst().orElse{Optional.of(new JsonArray())}
        optional.get()
因此,我最终无法使用
findFirst
orElse

我做错了什么

谢谢

更新:

最后,我删除了
findFirst
之后的
orElse
,然后检查可选的

        optional.isPresent() ? optional.get(): new JsonArray()
无论如何,如果有人有更好/优雅的解决方案,请告诉我

关于。

如果您使用
findFirst()
您会得到一个
可选的
,但是如果您使用
orElse()
(这是
可选的
方法),您会得到一个未包装的对象,因为您再也无法得到
可选的
。您可以从
findFirst()
unwrapped中获取找到的内容,或者从
orElse()
中获取“默认”值

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

Optional.of("foo").orElse("bar");  // Returns String "foo"
Optional.empty().orElse("bar");    // Returns String "bar"
如果使用
findFirst()
您将获得一个
可选的
,但是如果使用
orElse()
(这是
可选的
方法),您将获得未包装的对象,因为您无法再获得
可选的
。您可以从
findFirst()
unwrapped中获取找到的内容,或者从
orElse()
中获取“默认”值

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

Optional.of("foo").orElse("bar");  // Returns String "foo"
Optional.empty().orElse("bar");    // Returns String "bar"

Java中的
def optional
应该是什么?这是groovy,但我使用的是Java 8 stream什么
def optional
应该是Java中的?这是groovy,但我使用的是Java 8 stream谢谢,这是我认为最好使用的
orElseGet{->new JsonArray()}
,在这种情况下,所以你不会在每次调用它时都创建一个新的,不管是什么hanks,这就是我认为最好使用
orElseGet{->new JsonArray()}
在这种情况下,所以你不会在每次调用它时都创建一个新的,不管发生什么