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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |