我想确保列表中的所有数字都组合在一起。让我的例子说明这一点:检测流中的重复组
{1, 1, 1, 2, 2} // OK, two distinct groups
{1, 1, 2, 2, 1, 1} // Bad, two groups with "1"
{1, 2, 3, 4} // OK, 4 distinct groups of size 1
{1, 1, 1, 1} // OK, 1 group
{3, 4, 3} // Bad, two groups with "3"
{99, -99, 99} // Bad, two groups with "99"
{} // OK, no groups
下面是如何获取流:
IntStream.of(numbers)
...
现在我需要传递或返回“确定”的例子也并抛出AssertionError
或返回上“坏假“ 例子。我如何使用Stream API来做到这一点?
这里是我的额外Set
当前解决方案创建:
Set<Integer> previousNumbers = new HashSet<>();
IntStream.of(numbers)
.reduce(null, (previousNumber, currentNumber) -> {
if (currentNumber == previousNumber) {
assertThat(previousNumbers).doesNotContain(currentNumber);
previousNumbers.add(currentNumber);
}
return currentNumber;
}
);
您的解决方案不正确。考虑到当前的实现(显然假定顺序执行),它可能会起作用,但该函数显然违反了关联性要求。不幸的是,没有第三方帮助,没有简单的解决方案... – Holger
@Holger你能解释什么是“结合性要求”? –
@MichalKordas,请参阅[documentation](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-T-java.util.function.BinaryOperator- ):累加器必须按照规范进行关联。 –