2016-09-21 68 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."); 

调用代码应该对空值的存在责任,并应避免调用与空你的方法。理想情况下,调用代码应将空值视为异常值,并应尽可能避免处理空值。

相关问题