假设我的项目中有这个代码:
public List<T> getAll(Integer parameter) {
if(parameter != null && parameter > -1) {
// do something here
}
}
我的问题是:如何使用Optional
进行检查,而不是使用if
,或者是否还有其他可以使用的内容?
答案 0 :(得分:18)
可选的设计灵感来自功能编程世界的monad。在这种情况下,它可能看起来像这样:
public List<T> getAll(Integer parameter) {
return Optional.ofNullable(parameter)
.filter(p -> p > -1)
.map(p -> *some modification*) //this line is optional
.orElseGet(() -> *some default value, probably an empty list*)
}
在这种情况下,条件检查在filter
方法中执行。如果给定的Predicate
不匹配,则基础Optional
将为空。
如果要对基础值执行操作,请使用map
方法,为其提供Function
,该Optional
应应用于由ifPresent()
包装的元素。
最后,您只需使用orElseThrow
执行某项操作,抛出异常orElse
或只返回orElseGet
或orElseGet
的默认值。请注意,Supplier
接受TimeStamp BlockSeqNum SeqNum X-axis Y-axis Z-axis
4294967295 0 0 27 20 -4
4294967295 0 1 48 11 -13
4294967295 0 2 45 0 -7
4294967295 0 3 38 -9 -2
4294967295 0 4 34 -42 -28
4294967295 0 5 -29 35 -35
4294967295 0 6 -3 -46 0
4294967295 0 7 0 2 -10
4294967295 0 8 6 113 -32
4294967295 0 9 -4 20 27
4294967295 0 10 -14 -15 -19
4294967295 0 11 23 51 -19
4294967295 0 12 10 34 1
4294967295 0 13 -7 -2 15
4294967295 0 14 13 -5 -30
4294967295 0 15 -24 30 51
4294967295 0 16 -18 39 -45
实例,这会使其懒惰地评估默认值。
如果你想深入挖掘,请查看Devoxx的@ stuart-marks对话:https://www.youtube.com/watch?v=Ej0sss6cq14&t=2767s
在您的情况下,可能根本不需要可选项。只是两种方法。一个带参数,另一个没有。
答案 1 :(得分:7)
Optional
用于此类案例Stuart Marks中的Optional - The Mother of All Bikesheds状态:
Rule #4 :创建一个Optional通常是一个坏主意,因为它的特定目的是从中链接方法以获取值。
这会产生无用的开销,而代码可读性和可维护性没有任何改进。因此,您不应将参数包装为可选参数。
和
Rule #6 :避免在字段,方法参数和集合中使用Optional。
避免在方法参数中使用Optional
- 它不能真正使参数可选
强制呼叫网站为所有内容创建Optionals:
myMethod(Optional.of("some value"));
myMethod(Optional.empty());
答案 2 :(得分:3)
使用Optional<Integer>
public List<T> getAll(Integer paramter) {
return Optional.ofNullable(parameter)
.filter(p -> p > -1);
}
Optional<>
只是Optional模式的一个实现。有用的方法也是Optional<T>#orElse(T default)
,如果有null
,则将值设置为默认值,
如果您已经感兴趣但仍无法回答您的疑问,请在评论中要求澄清。我会尽快回复。
答案 3 :(得分:-1)
您需要清楚自己对方法的期望。可能性:
Optional<Integer>
作为参数。 “无空”方式是这样做的,并且根本不适应提供null的调用者 - 如果他们得到NullPointerException,那是他们自己的错,因为他们违反了规则。您不必使用stream或lambdas来使用Optional(当然,你可以)。
你可以写一下:
public List<T> getAll(Optional<Integer> maybeParameter) {
if(maybeParameter.isPresent() && maybeParameter.get() > -1) {
// do something here
}
}
查看Optional
在JavaDoc中的其他方法,看看它是如何使用的。
如果您不想更改方法的签名,可以使用Optional.ofNullable()
将Integer
转换为Optional<Integer>
:
public List<T> getAll(Integer parameter) {
Optional<Integer> maybeParameter = Optional.ofNullable(parameter);
// work with the Optional here as before...
}
但是我在这里质疑这样做的价值。如果您的API接受空值,那么使用Optional
“幕后”处理它并不具有优势。
我认为Optional
的最佳用途是将其作为API的一部分公开。如果参数是可选的,则将其声明为Optional
而不是处理null(或者更好,使用方法重载,因此它们根本不需要传递任何内容)。如果可能未设置返回值,则返回类型Optional
,而不是返回null。
答案 4 :(得分:-2)
import java.util.Optional;
public class ExampleNullCheck{
public static void main(String args[])
{
Integer a = null;
Optional<Integer> checkInt = Optional.ofNullable(a);
System.out.println(checkInt.isPresent());
}//main
}//class