加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在单个流上组合allMatch,noneMatch和anyMatch

发布时间:2020-12-15 05:14:15 所属栏目:Java 来源:网络整理
导读:我想有以下逻辑:(我知道它不起作用,因为它不止一次地消耗流).但我不知道如何实现它. StreamByteBuffer buffers = super.getBuffers().stream();if (buffers.allMatch(b - b.position() 0)) { return OutgoingMessageStatus.FULLY_SENT;} else if (buffers.no
我想有以下逻辑:(我知道它不起作用,因为它不止一次地消耗流).但我不知道如何实现它.

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读