当前位置: 首页 > 知识库问答 >
问题:

在方法参数中使用供应商而不是可选

丰智
2023-03-14

我有一个接口,其参数可以为空。

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());

共有1个答案

范稳
2023-03-14

如果不希望客户端代码以 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使