我有一个接口,其参数可以为空。
int count(@Nullable F filter);
为了避免空参数和空检查,通常的建议是使用方法重载:
int count();
int count(@NonNull F filter);
在某些情况下,我不喜欢这种方法,因为它迫使客户做这种工作:
F f = getFilter()
f != null ? count(f) : count()
客户端使用更方便:
count(getFilter())
初看起来,可选选项可以解决这个问题,但是“可选”不应该用于参数https://rules.sonarsource.com/java/RSPEC-3553
所以我的问题是:我可以用供应商来代替吗?
//service code:
int count(Supplier<F> filter) {
Optional.ofNullable(filter.get()).map(f->count(f)).orElseGet(() -> count());
};
//client code:
count(() -> getFilter())
以至
int count(Supplier<Optional<F>> filter)
这个想法没有任何警告。
我个人很喜欢我之后的代码,但是这不是作弊吗?为什么它比可选的更好?
编辑:感谢评论。我同意,在我的例子中,供应商只是一个复杂的@Nullable方法。
我将返回:
int count();
int count(@NonNull F filter);
/////
getFilter().map(f->count(f)).orElseGet(() -> count());
如果不希望客户端代码以 null
进行拨号,则可以更改方法 getFilter()
以返回 Optional
在这种情况下,客户端中的代码如下所示:
int count = getFilter().map(MyClass::count).orElse(MyClass.count());
使用这种方法,您的方法
count(F)
不需要任何额外的逻辑。
如果感觉太复杂,那么可以实现
count(F)
,如果提供的参数为null
,它将委托给count()
。
您对
供应商的尝试
我想根据Person类中的一些属性过滤掉重复项。我的方法定义如下: 对上述方法的调用如下: 在方法定义中,我可以看到参数可以是函数实现,但上面代码中传递的参数是供应商类型(因为它们返回的是结果,不接受任何参数。但这很好。它是如何工作的?有人能解释吗。
为什么Java中的方法将作为参数,而不是?这是一个问题,我找到的最好的答案是在这里,说明 这里最重要的概念是,通过提供方法引用(或函数),可以懒惰地初始化它。如果不需要,则不需要创建异常对象。只在你需要的时候创建它。 但我还是不明白。为什么对象创建不能是懒惰的?
据甲骨文说,, 返回一个新的完全未来,该完全未来由ForkJoinPool.common池()中运行的任务异步完成,该任务的值通过调用给定的供应商获得。 静态CompletableFuture supplyAsync(供应商-供应商,执行者-执行者)返回一个新的CompletableFuture,该新的CompletableFuture由在给定执行者中运行的任务异步完成,其值通过调用给定供应商获得
问题内容: 我想用 具有要求构造函数参数的Exception类型。像这样: 有没有一种方法可以创建一个将我的参数值传入的供应商? 问题答案: 当然。
我想用 使用请求构造函数参数的异常类型。类似这样的事情: 有没有一种方法可以创建一个供应商来传递我的参数值?
问题内容: Python的Zen指出,只有一种方法可以做事情-但我经常遇到决定何时使用函数以及何时使用方法的问题。 让我们举一个简单的例子- ChessBoard对象。假设我们需要某种方式使董事会上所有合法的King举动均可用。我们写ChessBoard.get_king_moves()还是get_king_moves(chess_board)? 我得到的答案基本上没有定论: 为什么Python使