假设我有一个f: Int => String可能抛出异常的函数.我想写一个函数tryF(f: Int => String, arg: Int, defaultOpt: Option[String]),其工作原理如下:
f(arg)如果没有抛出异常,则调用并返回结果defaultOpt.isDefined然后返回defaultOpt.get我写的如下:
def tryF(f: Int => String, arg: Int, defaultOpt: Option[String]) = {
val r = scala.util.Try(f(arg))
r.toOption orElse defaultOpt getOrElse r.get
}
Run Code Online (Sandbox Code Playgroud)
是否有意义 ?你会改写它吗?
是否有更简洁的方法来实现以下目标?
fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
match thing {
Some(x) => Some(Box::new(x)),
None => None,
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个构建列表的新方法,我希望它将列表的总和作为OptionalDouble值返回.
但是,当我使用Java 8计算总和值时,我总是将返回值作为Double.
我该如何转换?
Double to OptionalDouble
Run Code Online (Sandbox Code Playgroud)
以下是我的和计算代码:
private static OptionalDouble sumListValue() {
// Build list
List<Double> testList = new ArrayList<>();
testList.add(...);
...
...
return testList.stream().mapToDouble(value -> value).sum();
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
对于一项家庭作业,我必须设置一个变量。给我的set方法将其转换为“可选”。但是,我必须将此变量存储在不允许可选变量的ArrayList中。如何转换该变量使其不再是可选变量?
设置方法:
public void setParentVertex(IVertex<T> parentVertex)
{
if(parentVertex == null)
this.parentVertex = Optional.empty();
else
this.parentVertex = Optional.of(parentVertex);
}
Run Code Online (Sandbox Code Playgroud)
我在尝试使用它的地方:
ArrayList<IVertex<T>> path = new ArrayList<IVertex<T>>();
IVertex<T> parent = current.getLabel().getParentVertex();
path.add(parent);
Run Code Online (Sandbox Code Playgroud)
我不断收到的错误是:“我在其中声明变量“ parent”的那一行出现了“错误:不兼容的类型:Optional>无法转换为IVertex”。谢谢。
是否有任何简便的快速简便方法可以获取非String类型的可选值,并获取String值,如果它是.some(),则为该值的String解释;如果它是.none(),则为默认值下列:
let statusCode = (resp as? HTTPURLResponse)?.statusCode
let statusCodeString: String
if let statusCode = statusCode {
statusCodeString = "\(statusCode)"
} else {
statusCodeString = "None"
}
Run Code Online (Sandbox Code Playgroud)
对于一个相对简单的事情来说,它似乎太冗长了,感觉就像我缺少明显的东西。
仅使用nil-coalescing运算符不起作用,因为您必须提供相同类型的默认值。
物体可以向任一方向铸造,这是不安全的.如何强制任何对象为null并在生产代码中使用它们?
例如,在Option<'T>,我现在可以轻松地以3种方式,使可空类型:Some (Unchecked.defaultof<'T>),None和null.
我似乎错过了一些非常简单的事情.以下不起作用:
#include <optional>
class Alpha {
Alpha() { }
Alpha(const Alpha& that) { }
Alpha(Alpha&& that) { }
~Alpha() { }
static std::optional<Alpha> go() {
return Alpha();
}
};
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
no suitable user-defined conversion from "Alpha" to "std::optional<Alpha>" exists
T in optional<T> must satisfy the requirements of Destructible
'return': cannot convert from 'Alpha' to 'std::optional<Alpha>'
Run Code Online (Sandbox Code Playgroud)
我错过了什么,你能解释一下原因吗?
我知道Optional.ofNullable()值是否也可以为null。我的问题是,为什么还没有默认行为Optional.of()呢?如果值不能是null,为什么要放在Optional第一个?如果结果还是为空,那么无论如何您都会得到一个NPE。如果您Optional使用of()方法构造一个,那么您仍然会拥有Optional包装器的所有其他方法,只有在值可以为的情况下,它们才真正有目的null。
编辑:我已经阅读了为什么在Optional.ofNullable上使用Optional.of?在发布此消息之前,但答案是“因为您可以更快地发现错误,并且以这种方式进行跟踪更容易”。但是我有点不同意,也许您的堆栈跟踪中会包含一些额外的行,但是仍然很容易查明NPE的来源。
因此,我必须丢失一些东西,如果要使用Optional,我希望执行一个语句块,否则会引发异常。
Optional<X> oX;
oX.ifPresent(x -> System.out.println("hellow world") )
.orElseThrow(new RuntimeException("x is null");
Run Code Online (Sandbox Code Playgroud)
如果oX不为null,则打印hello world。如果oX是,null则抛出运行时异常。
我试图通过使用Java Optional来避免传统的if / else阻止。但是我仍然缺少对如何实现下一个要求的理解:
if (x != null)
foo1();
else
foo2();
public void foo1(){
print("X not null");
}
public void foo2(){
print("X is null");
}
Run Code Online (Sandbox Code Playgroud)
谢谢