Java 8流get()on Optional - 方法内部或外部?

时间:2017-01-09 23:15:04

标签: java java-8 java-stream optional

我想知道在方法内部或外部使用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();
    }
}

然后在第二节课:

//...
MyObject1 myObject1 = firstClass.myMethod(myObject2).get();

OR:

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);

2 个答案:

答案 0 :(得分:2)

第一种解决方案更好。

FirstClass只是提供了一种方法,却不知道如何使用它。它只是做它应该做的事情,而不是在论证上过于规范。

如果愿意,调用者可以在get上失败。更好的是,调用者可能希望处理空案例并返回特定错误或进一步工作。

答案 1 :(得分:1)

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

如果您不想以这种方式使用选项,那么上述任何一种方法都可以。