可选的Java 8 stream get()-在方法内部还是外部?

可选的Java 8 stream get()-在方法内部还是外部?,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我想知道在方法内部或外部使用get()是否有任何区别,以及哪种方法更好。我对流进行操作,并返回其结果以在另一个类中对其进行操作 例如: class FirstClass{ //... public static Optional<MyObject1> myMethod(MyObject2 myObject2) { return map.entrySet() .stream() .filt

我想知道在方法内部或外部使用get()是否有任何区别,以及哪种方法更好。我对流进行操作,并返回其结果以在另一个类中对其进行操作

例如:

class FirstClass{
    //...

    public static Optional<MyObject1> myMethod(MyObject2 myObject2) {
        return map.entrySet()
                .stream()
                .filter(a -> Objects.equals(a.getValue(), myObject2))
                .map(Map.Entry::getKey)
                .findFirst();
    }
}
或:

以及:


java可选类型是为了防止
NullPointerException
。对空的可选项调用
#get()
(可能是
#firstFirst()
的结果)将导致运行时抛出
NoTouchElementException
。为了避免此问题,最好先检查
if(myObject1.isPresent())
myObject1.ifPresent(unwrappedMyObject1->{…})


如果您不想以这种方式使用optionals,上述两种方法都可以使用。

第一种解决方案更好。

FirstClass
只是提供了一种方法,而不知道如何使用它。它只是做它应该做的事情,在争论中没有太多的规定性


如果调用方希望,则由调用方在
get
上失败。更好的是,调用方可能希望处理空的大小写并返回特定的错误或进行进一步的工作。

第一种方法还允许您使用诸如
\ifPresent
\orElse
等方法,这些方法应该是毫无疑问的。第二种方法仅在假定对象始终存在时有效,否则它将抛出异常。如果是这种情况,您永远不应该返回
可选的
。另一方面,如果没有假定该值始终存在,则不应使用在缺少该值时会中断的方法。因此,在这两种情况下,只有一种有效的方法。
//...
MyObject1 myObject1 = firstClass.myMethod(myObject2).get();
class FirstClass{
    //...

    public static MyObject1 myMethod(MyObject2 myObject2) {
        return map.entrySet()
                .stream()
                .filter(a -> Objects.equals(a.getValue(), myObject2))
                .map(Map.Entry::getKey)
                .findFirst()
                .get();
    }
}
//...
MyObject1 myObject1 = firstClass.myMethod(myObject2);