使用Java8已经有6个多月了,我对新的API变化非常满意。我仍然不确定的一个方面是何时使用optional
。我似乎在想要在任何地方都使用它(有些东西可能是null
)和根本不在任何地方)之间摇摆。
当我可以使用它时,似乎有很多情况,但我从来不确定它是增加了好处(可读性/空安全性)还是仅仅导致了额外的开销。
因此,我有几个例子,我想了解社区对optional
是否有益的看法。
1-当方法可以返回null
时,作为公共方法返回类型:
public Optional<Foo> findFoo(String id);
2-当参数可能为空
时作为方法参数:
public Foo doSomething(String id, Optional<Bar> barOptional);
3-作为bean的可选成员:
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
总的来说我不认为:
List<Optional<Foo>>
添加任何内容--特别是因为可以使用filter()
删除null
值等,但是在集合中optional
有什么好的用途吗?
有没有我漏掉的案子?
optional
的主要设计目标是为返回值的函数提供一种表示返回值不存在的方法。请参阅此讨论。这允许调用方继续一系列fluent方法调用。
这与OP问题中的用例#1最为匹配。但是,由于intstream.findfirst
这样的东西永远不会返回null,所以没有值比null更精确。
对于用例#2,将一个可选参数传递给一个方法,这是可以实现的,但这是相当笨拙的。假设您有一个方法,它接受一个字符串,后跟一个可选的第二个字符串。接受optional
作为第二个参数将得到如下代码:
foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());
foo("bar", "baz");
foo("bar", null);
最好的方法可能是有一个重载的方法,它接受单个字符串参数,并为第二个字符串参数提供默认值:
foo("bar", "baz");
foo("bar");
这确实有局限性,但它比上面的任何一个都好得多。
用例#3和#4在类字段或数据结构中有optional
,这被认为是对API的误用。首先,它违背了顶部所述的optional
的主要设计目标。第二,它没有增加任何价值。
有三种方法可以处理optional
中没有值的情况:提供替代值、调用函数提供替代值或引发异常。如果要存储到一个字段中,则需要在初始化或赋值时执行此操作。如果要将值添加到列表中,就像操作中提到的那样,您可以选择不添加值,从而“平坦化”不存在的值。
我相信有些人可能会想出一些虚构的情况,他们真的想在字段或集合中存储optional
,但一般来说,最好避免这样做。
我找不到使用Java的可选功能执行以下操作的方法: 通过使用
声明函数以映射值并在存在值时使用它们是很方便的。 在您有几个强制对象和几个可选对象的情况下,我发现自己将其他对象包装为可选对象。也可以使用(mandatoryObject),这样我就可以在它们上使用相同的表达式,而不必全部倒写。 但是我不喜欢这个代码: 所以我把它包装起来: 但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的。它们非常重要,我只是给每个人的印象是它们是可选的。 所以我的问题是:
问题内容: 我有以下代码(使用Python 2.7): 现在,我希望能够调用此程序,例如在普通程序或某些子命令后附加: 基本上,我需要声明可选的子解析器。我知道这并不是真正支持的方法,但是有任何解决方法或替代方法吗? 编辑:我得到的错误信息: 问题答案: 根据文档,带有(而不带有)的会自动打印版本号:
我正在尝试使用Intelij模板编写一个自定义setter,但用于Google的Guava Optionals。例如,如果我有一个如下的类: 在Android Studio中使用默认的Setter生成输出: 我想实现的是: 到目前为止,我尝试的是复制Intelij的模板并使用StringUtil。split()以剥离可选的 错误 对我该怎么做有什么建议吗? 默认设置生成Setter的默认模板 我的
问题内容: 我在asp.net mvc页面上使用knockoutjs。我正在使用ajax通过调用将表单持久化回服务器,然后使用jQuery将结果发布回服务器。视图模型上的所有属性均已成功序列化,但Javascript日期除外,该Javascript日期保留为空对象。 宣言: 保存数据: viewModel.startTime()的console.log值为: 在 Save Data的 第1行之后,
使用< code>Optional,我想根据映射结果返回接口的某个实现(< code>First或< code>Second)。这是< code>First和< code>Second实现的接口: 以下< code>Optional用法是错误的: orElse,可选 既然类<code>First<code>和<code>Second<code>都实现了接口<code>MyInterface<cod