2016-09-21 67 views
0

參數和操作對象我有一個方法的Java可選在ifPresent

public String getSomething(Optional<String> name) { 
    StringBuilder something = new StringBuilder("Hello"); 
    name.ifPresent(n -> something.append(n)); 
    return something.toString(); 
} 

我用的IntelliJ,並抱怨說,你不應該使用選配的參數,只返回類型。我也讀過,你想避免函數式編程中的副作用,你不應該操縱對象。

所以我一直在想是,如果它是不是更好做

public String getSomething(String name) { 
    StringBuilder something = new StringBuilder("Hello"); 
    if (name != null) { 
     something.append(name); 
    } 
    return something.toString(); 
} 

在那裏使用可選的任何好處?我可以看到的一個好處是該方法告訴您該參數是可選參數。

+0

你爲什麼要傳遞一個可選字符串?你不知道你有一個字符串首先通過? –

+0

請參閱http://stackoverflow.com/questions/31922866/why-should-java-8s-optional-not-be-used-in-arguments – Tunaki

+0

@MuratK。有時候人們會在沒有參數值的情況下調用我的方法。字符串只是一個例子,在我的真實情況下它實際上是一個DateRange。然後我仍然想要返回一個值。 – uraza

回答

0

更好地通過Optionalnull。 IntelliJ嘗試過於規範。假設是,你在呼叫地點做:

Optional<String> nameOpt = ... 
nameOpt.ifPresent(name -> getSomething(name)); 

是的,理想的。希望在這裏nameOpt沒有參數...

在這裏,你可以使用地圖

Optional<String> sOpt = nameOpt.map(this::getSomething); 

public String getSomething(String name) { 
    StringBuilder something = new StringBuilder("Hello"); 
    something.append(name); 
    return something.toString(); 
} 

這是完美的功能,和IntelliJ會喜歡上它了。

隨着java 9的可選的能力將增長。


看來實際的問題是:有一個可能爲空字符串參數, ,我們應該處理:

Optional.ofNullableparameter) 

進一步,或通過參數上。

而且其一個可選地圖可以安全地處理鏈的可能的字符串並返回一些其它可選:

// Get the length of the uppercased parameter, when it exists: 
Optional<Integer> lengthOpt = Optional.ofNullable(parameter) 
    .map(s -> s.toUpperCase(Locale.DE)) 
    .map(String::length); 

如果參數是 「Goßlung」 - 「GOSSLUNG」 - Optional.of(8)。

(這個例子應該使用OptionalInt,但是這將是一樣的。)

+0

調用者不一定有可選。調用者更可能只有可選值或沒有值。這就是爲什麼我需要檢查它的存在。 – uraza

0

傳遞Optional在這種情況下確定的,但你可以寫somethig像

String nullableName = null; 
Optional<String> name = Optional.ofNullable(nullableName); 
StringBuilder something = new StringBuilder("Hello"); 
// getSomething equivalent 
name.map(something::append).orElse(something); 

你映射不爲空值或只是返回生成器

0

處理此問題的最佳方法是告訴調用者不要首先傳遞null。

這實際上是大多數Java SE的工作原理。例如,如果您嘗試執行new URL(null),您將會遇到異常情況。 new BigDecimal(null),System.getProperty(null),ImageIO.read(null)等等也是如此。

你的方法應該這樣做。事實上,對於there exists a method這個目的而:

public String getSomething(String name) { 
    Objects.requireNonNull(name, 
     "This method may not be called with a null argument."); 

調用代碼應該對空值的存在責任,並應避免調用與空你的方法。理想情況下,調用代碼應將空值視爲異常值,並應儘可能避免處理空值。

相關問題