【发布时间】:2017-03-15 13:20:48
【问题描述】:
我正在练习一些入门级的 java 8 lambda 功能。
给定一个消息列表,每个消息都包含一个消息偏移量,其中所有偏移量必须形成一个连续的整数列表,我试图找到要警告的差距。我觉得这一切都应该通过一个不错的 lambda 来实现。但我无法理解它。
所以,有这个工作的 sn-p:
private void warnAboutMessageGaps(final List<Message> messages) {
final List<Long> offsets = messages.stream()
.sorted(comparingLong(Message::getOffset))
.map(Message::getOffset)
.collect(toList())
;
for (int i = 0; i < offsets.size() - 1; i++) {
final long currentOffset = offsets.get(i);
final long expectedNextOffset = offsets.get(i) + 1;
final long actualNextOffset = offsets.get(i + 1);
if (currentOffset != expectedNextOffset) {
LOG.error("Missing offset(s) found in messages: missing from {} to {}", currentOffset + 1, actualNextOffset - 1);
}
}
}
我不知道如何制作它以便我可以在 lambda 中进行“与上一个/下一个对象比较”。任何指针将不胜感激。
/edit:关于 StreamEx 和其他第三方解决方案的建议虽然受到赞赏,但并不是我想要的。
【问题讨论】:
-
这是流不太擅长的事情,因为如果您必须查看流中的上一个或下一个对象,它不会很好地并行化。
-
似乎你需要两组之间的对称差异,番石榴可以帮助解决这个问题:
Set<Long> all = LongStream.range(offsets.get(0), offsets.get(offsets.size() - 1)).boxed().collect(Collectors.toSet()); System.out.println(Sets.symmetricDifference(all, ImmutableSet.copyOf(offsets))); -
为什么是
.sorted(comparingLong(Message::getOffset)) .map(Message::getOffset)而不是.map(Message::getOffset).sorted()?
标签: java lambda java-8 java-stream