Java 8 lambda:迭代流对象并在流中使用上一个/下一个对象

Sad*_*nny 6 java lambda java-8 java-stream

我正在练习一些入门级的java 8 lambda功能.

给定一个消息列表,每个消息都包含一个消息偏移量,其中所有偏移量必须形成一个连续的整数列表,我试图找到间隙来警告.我觉得这一切都应该是一个很好的lambda.但我无法理解它.

所以,有这个工作片段:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是如何制作它以便我可以在lambda中进行"与上一个/下一个对象比较".任何指针将不胜感激.

/编辑:有关StreamEx和其他第三方解决方案的建议,虽然赞赏,但并不是我想要的.

Kap*_*lan 1

对于目前的问题,这种做法似乎更适合

messages.stream().sorted( Comparator.comparingLong( Message::getOffset ) )
  .reduce( (m1, m2) -> {
    if( m1.getOffset() + 1 != m2.getOffset() )
      LOG.error( "Missing offset(s) found in messages: missing from {} to {}", m1.getOffset(), m2.getOffset() );
    return( m2 );
  } );
Run Code Online (Sandbox Code Playgroud)

该解决方案的使用reduce偏离了其预期用途。reduce它仅使用遍历流中所有对的能力。
的结果reduce未被使用。(不可能进一步使用该结果,因为这需要可变的归约。)