我在玩以下问题:将Java 8的Optional与Stream ::flatMap一起使用,并想向自定义添加方法Optional<T>
,然后检查其是否有效。
更准确地说,我想在其中添加一个stream()
,CustomOptional<T>
如果不存在任何值,则返回一个空流,如果存在一个元素,则返回一个具有单个元素的流。
但是,我得出的结论Optional<T>
是最终结论。
为什么会这样呢?有很多类未声明为final,因此我个人没有理由在此处声明Optional<T>
final。
第二个问题是,如果担心所有方法都将被覆盖并使类变为非最终类,为什么所有的方法都不能为最终类呢?
根据Java SE 8
API文档的此页面
,Optional<T>
是一个基于值的类。根据API文档的此页面,基于值的类必须是不可变的。
Optional<T>
最后声明所有方法将防止方法被覆盖,但不会阻止扩展类添加字段和方法。扩展类并添加字段以及更改该字段的值的方法将使该子类可变,因此将允许创建可变的Optional<T>
。以下是此类子类的示例,如果Optional<T>
不声明为final
,则可以创建该子类。
//Example created by @assylias
public class Sub<T> extends Optional<T> {
private T t;
public void set(T t) {
this.t = t;
}
}
声明Optional<T>
final可以防止创建上述子类,因此可以保证Optional<T>
始终不变。
但缺少透明装饰的美感。
问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选
问题内容: 我读苹果文档 ,当我发现这句话: 本类仅包含一个属性:。 此属性存储对应用程序窗口的引用。此窗口表示应用程序视图层次结构的根。这 是绘制所有应用程序内容的地方。请注意,window属性是 可选的 ,这意味着 在某些时候它可能没有任何值(为nil ) 。 我不明白的是:为什么此属性有时可能为零? 变成零的情况是什么? 问题答案: 当您关闭应用程序时,您的应用程序仍可以接收静默通知 或在后
为什么可选在线? 当可选值包含“nil”时,必须将可选类型“Int?”的值解包为“Int”类型的值,并使用“?”合并,以提供默认值,当可选值包含“nil”时使用“!”强制解包以中止执行 所以这修复了它: 如果我将其分解,则会在添加<code>let index</code>时发生更改。。。。 OK -这将返回first的总计数,total不是可选的: 确定-此枚举和总计不是可选的: 错误 - 这会
问题内容: 在我看到的所有支持可选参数的编程语言中,都有一个模仿,即可选参数必须出现在声明的末尾。可选项目后不得包含必需的参数。是什么原因呢?我想这可能是编译器/解释器的要求。 问题答案: 好吧,如果它们在最前面,您将如何检测何时停止供应它们?唯一的方法是 在 可选参数 之后 变量类型是否不同。有点不可思议的要求,因此您只需将它们强制设置为最后是有意义的(省去了用于检测“最终”可选参数的复杂规则的
问题内容: 我读到try-with-resources 中的块是可选的。我试图在try-with- resources块中创建一个对象,没有后续块,只是从eclipse中获取编译器错误:“ 自动调用引发了未处理的异常类型。” 由于可以在try-with- resources中使用的每个资源都实现了,因此在调用该方法时可能会引发异常,因此我不明白该子句是可选的,因为它不允许我跳过从中捕获异常的过程。