- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想要以下逻辑:(我知道它不起作用,因为它不止一次消耗流)。但我不确定如何实现它。
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/
我阅读了 IntStream::noneMatch 的 Javadoc . 它说: Returns whether no elements of this stream match the provi
我想要以下逻辑:(我知道它不起作用,因为它不止一次消耗流)。但我不确定如何实现它。 Stream buffers = super.getBuffers().stream(); if (buffers.
如果找到元素,anyMatch 操作将返回 true - 如果找到匹配元素,noneMatch 操作将返回 false。 如果没有找到匹配的元素,anyMatch 操作将返回 false - 如果没有
这个问题已经有答案了: Java stream - purpose of having both anyMatch and noneMatch operations? (2 个回答) 已关闭 4 年前
我在另一篇文章中读到,经过调查发现 anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否已找到结果,如果是,则所有其他线程都是停止了。 我假设,但想知道是否有人可以验证
我是一名优秀的程序员,十分优秀!