【问题标题】:Why does allMatch function return true on empty lists in java [duplicate]java - 为什么allMatch函数在java中的空列表上返回true [重复]
【发布时间】:2019-03-04 01:52:49
【问题描述】:

Java SE 8 docallMatch(Predicate<? super T> predicate)

"... 评估流元素上谓词的全称量化(对于所有 x P(x))。如果流为空,则称量化为空满足且始终为真(无论的 P(x))。”

将空列表视为 allMatch true 似乎并不直观。什么是“普遍量化”和“空虚满足”?

【问题讨论】:

  • 让我们这样说:allMatch 搜索任何匹配的项目。由于列表为空,因此您不能指向任何不匹配的项目。因此它返回 true

标签: java java-8 java-stream


【解决方案1】:

假设我有一份馅饼清单。

我想检查是否所有的馅饼都是山核桃。

所以我看第一个馅饼是樱桃,所以我说那是假的。

只有当我能证明我的派不是山核桃时,我才会说这是假的。

所以当我没有馅饼时,没有一个馅饼不是山核桃。

这是一个愚蠢的例子,但这个警告已经让我好几次了

【讨论】:

  • 当然,我们可以这样想,但也仍然没有山核桃派。对我来说,这似乎是一个任意的约定。与将空流的 allMatch 视为错误相比,这种思维方式有什么优势?
  • @TreefishZhang 好好想想方法大概是怎么实现的。 (源代码就在那里。当我找到它时,我会把它链接给你)你提供了一个Predicate 并且正在检查Stream 中的每个项目。您可能会有一个声明,例如if(!predicate.test(item)) return false;。 IE。您将检查某些内容是否不匹配,因为显然如果您检查它是否匹配,那么如果其中任何一个匹配,您将返回 true。因此,要实现为空 Stream 返回 false,您必须添加一个空支票
  • @GBlodgett 所以这是一个通过更大的经济获胜的案例?因为我们不必按照这个惯例检查空?
  • @TreefishZhang 我的意思是他们这样做的一个原因。有理由这样做吗?正如我所见,为空的Stream 返回 true 并不合乎逻辑,但也许我编程时间太长并且已经习惯了这样的约定
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2019-12-07
  • 2011-12-14
相关资源
最近更新 更多