作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我阅读了有关 Option
的文章帮助您避免 NullPointerException 的类,我开始到处使用它。想象一下这样的事情:
var file:Option[File] = None
val actualFile = file.getOrElse(new File("nonexisting"))
if(actualFile.getName.equals("nonexisting")) { // instead of null checking
}
else { // value of file was good
}
.get
已被弃用。 .你们也在用Option做这种事情,还是我走错了路?
最佳答案
返回 Option
通常不是一个好主意然后使用 getOrElse
产生一些表示“未找到”的哨兵值。就是这样Option
用于:表示未找到值!Option
当与函数式编程结构(如 map
)结合使用时,真正显示出它的威力。和 foreach
.这在处理多个选项时最为有效。例如,假设我编写了一个方法,它接受一个字符串并返回一个文件,但前提是该文件存在并且是一个文件而不是目录:
import java.io._;
def niceFile1(s: String): File = {
val f = new File(s);
if (f.exists && !f.isDirectory) f else null
}
def niceFile2(s: String): Option[File] = {
val f = new File(s);
if (f.exists && !f.isDirectory) Some(f) else None
}
null
更容易——至少直到你忘记这可能会给你带来
null
你会得到一个 NPE。无论如何,让我们现在尝试使用它。
def niceFopen1(s: String) = {
val f = niceFile1(s);
if (f!=null) new FileInputStream(f) else null;
}
def niceFopen2(s: String) = niceFile2(s).map(f => new FileInputStream(f))
map
为我们做了所有肮脏的工作: None 被映射到 None,和
Some(file)
被映射到
Some(fileinputstream)
.简单!
def totalSize2(ss: Seq[String]) = {
(0L /: ss.flatMap(niceFile2)){(sum,f) => sum+f.length}
}
None
呢? ?难道我们不需要注意并以某种方式处理它们吗?嗯,这就是
flatMap
进来:它将所有答案连接到一个列表中。
None
是长度为零的答案,因此它忽略它。
Some(f)
有一个答案--
f
- 所以它把它放在列表中。然后我们使用折叠将所有长度相加——现在列表中的所有元素都是有效的。很不错!
关于scala - 到处使用 Option 感觉有点尴尬。难道我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2476835/
我有一个图书馆,我计划以 dex 形式使用。我想直接针对这个库进行编译,但不导出它。相反,我想将它放在我的资源中并使用类加载器实际实例化它。 这是我的图书馆: public class Foo {
我是一名优秀的程序员,十分优秀!