我有一个Optional
,我想“转换”为OptionalInt
,但是似乎没有简单的方法可以做到这一点。
这是我想做的(人为的示例):
public OptionalInt getInt() {
return Optional.ofNullable(someString).filter(s -> s.matches("\\d+")).mapToInt(Integer::parseInt);
}
但是,
mapToInt()
没有Optional
方法。我能想到的最好的是:
return Optional.ofNullable(someString)
.filter(s -> s.matches("\\d+"))
.map(s -> OptionalInt.of(Integer.parseInt(s)))
.orElse(OptionalInt.empty());
但这似乎并不优雅。
我是否在JDK中缺少某些东西可以使转换更加优雅?
最佳答案
虽然代码不比普通条件表达式更具可读性,但是有一个简单的解决方案:
public OptionalInt getInt() {
return Stream.of(someString).filter(s -> s != null && s.matches("\\d+"))
.mapToInt(Integer::parseInt).findAny();
}
使用Java 9,您可以使用
public OptionalInt getInt() {
return Stream.ofNullable(someString).filter(s -> s.matches("\\d+"))
.mapToInt(Integer::parseInt).findAny();
}
如前所述,它们都不比普通的条件表达式更具可读性,但我认为它看起来仍然比使用
mapOrElseGet
更好(并且第一个变体不需要Java 9。