Pourquoi ne Stream.allMatch() renvoie true pour un vide stream?

Mon collègue et j'ai eu un bug qui était dû à notre hypothèse selon laquelle un vide de flux d'appel allMatch() serait de retour false.

if (myItems.allMatch(i -> i.isValid()) { 
    //do something
}

Bien sûr, il est une sorte de notre faute de prise en charge et de ne pas lire de la documentation. Mais ce que je ne comprends pas, c'est pourquoi la valeur par défaut allMatch() comportement pour un vide de flux retours true. Quel a été le raisonnement pour cela? Comme le anyMatch() (qui contrairement renvoie false), cette opération est utilisée de manière impérative qui s'écarte de la monade et probablement utilisé dans un if déclaration. Compte tenu de ces faits, est-il une raison pourquoi avoir allMatch() par défaut pour true sur un vide stream être souhaitable pour la majorité des usages?

  • C'est un peu bizarre. Nous nous attendons à ce que si allMatch retourne true alors devrait anyMatch. En outre, pour la vides cas, allMatch(...) == noneMatch(...) qui est aussi bizarre.
  • Wikipédia dit que c'est la convention: en.wikipedia.org/wiki/Universal_quantification#The_empty_set
  • Juste un petit aparté sur la syntaxe: au lieu d'écrire votre prédicat i -> i.isValid(), vous pouvez écrire Foo::isValid (où Foo est quelle classe vous êtes en streaming, bien sûr)
  • "Cette opération est utilisée de manière impérative qui s'écarte de la monade" - je doute que ces facteurs dans toute décision.
InformationsquelleAutor tmn | 2015-05-13