gpt4 book ai didi

java - 在单个流中组合 allMatch、noneMatch 和 anyMatch

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:27 25 4
gpt4 key购买 nike

我想要以下逻辑:(我知道它不起作用,因为它不止一次消耗流)。但我不确定如何实现它。

Stream<ByteBuffer> buffers = super.getBuffers().stream();
if (buffers.allMatch(b -> b.position() > 0)) {
return OutgoingMessageStatus.FULLY_SENT;
} else if (buffers.noneMatch(b -> b.position() > 0)) {
return OutgoingMessageStatus.WAS_NOT_SENT;
} else {
return OutgoingMessageStatus.PARTIALLY_SENT;
}

我该怎么做?

最佳答案

由于 super.getBuffers() 的结果是List<ByteBuffer> ,您可以对其进行两次迭代。

List<ByteBuffer> buffers = super.getBuffers();
if (buffers.stream().allMatch(b -> b.position() > 0)) {
return OutgoingMessageStatus.FULLY_SENT;
} else if (buffers.stream().noneMatch(b -> b.position() > 0)) {
return OutgoingMessageStatus.WAS_NOT_SENT;
} else {
return OutgoingMessageStatus.PARTIALLY_SENT;
}

请注意,这仍然不需要在所有情况下迭代所有元素。 allMatch一遇到不匹配的元素就返回,noneMatch一旦遇到匹配的元素就返回。所以在 PARTIALLY_SENT情况下,有可能没有看所有要素就得出结论。

另一种选择是

List<ByteBuffer> buffers = super.getBuffers();
if(buffers.isEmpty()) return OutgoingMessageStatus.FULLY_SENT;
Predicate<ByteBuffer> p = b -> b.position() > 0;
boolean sent = p.test(buffers.get(0));
if(!sent) p = p.negate();
return buffers.stream().skip(1).allMatch(p)? sent?
OutgoingMessageStatus.FULLY_SENT:
OutgoingMessageStatus.WAS_NOT_SENT:
OutgoingMessageStatus.PARTIALLY_SENT;
}

第一个元素的状态决定了我们必须检查的条件。一旦有矛盾的元素,allMatch立即返回,我们有一个 PARTIALLY_SENT情况。否则,所有元素都像第一个元素一样匹配,这意味着“全部发送”或“未发送”。

空列表的预检查产生与原始代码相同的行为并确保 get(0)永不中断。


如果您真的有一个 Stream 而不是一个可以迭代多次的源,则没有简单的捷径解决方案,因为这需要有状态的谓词。但是,有处理所有元素的简单解决方案。

Map<Boolean,Long> result=getBuffers().stream()
.collect(Collectors.partitioningBy(b -> b.position() > 0, Collectors.counting()));
return
result.getOrDefault(false, 0L)==0?
OutgoingMessageStatus.FULLY_SENT:
result.getOrDefault(true, 0L)==0?
OutgoingMessageStatus.WAS_NOT_SENT:
OutgoingMessageStatus.PARTIALLY_SENT;

return super.getBuffers().stream()
.map(b -> b.position() > 0?
OutgoingMessageStatus.FULLY_SENT: OutgoingMessageStatus.WAS_NOT_SENT)
.reduce((a,b) -> a==b? a: OutgoingMessageStatus.PARTIALLY_SENT)
.orElse(OutgoingMessageStatus.FULLY_SENT);

关于java - 在单个流中组合 allMatch、noneMatch 和 anyMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com