2017-01-09 83 views
2

我想知道在方法內部或外部使用get()時是否有任何區別,哪個想法更好。我運行在流式上,我將其結果返回給其他課程。Java 8 stream get()on可選 - 在方法內部還是外部?

例如:

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

第一個允許你也使用'#ifPresent','#orElse'等方法 – Rogue

+0

這應該是沒有問題的。如果您認爲該對象始終存在,則第二種方法才起作用,否則將引發異常。如果是這樣的話,你永遠不應該返回一個'Optional'。另一方面,如果該值不被認爲總是存在,則不應該使用一個方法,如果該值不存在就會中斷。所以無論哪種情況,只有一個有效的方法。 – Holger

回答

2

第一種解決方案比較好。

FirstClass只是提供了一種不知道如何使用它的方法。它只是做它應該做的事情,而不會對論據過於規範。

如果需要的話,由調用者在get上失敗。更好的是,調用者可能想要處理空案,並返回一個特定的錯誤或做進一步的工作。

1

java可選類型是爲了防止NullPointerExceptions。在空的可選項(#firstFirst()的可能結果)上調用#get()將導致在運行時拋出NoSuchElementException。爲避免此問題,最好先檢查if(myObject1.isPresent())myObject1.ifPresent(unwrappedMyObject1 -> { ... });

如果您不想以這種方式使用可選項,則上述任一方法都可以使用。