2015-11-05 3 views
3

Как Stream.findFirst(), есть ли способ написать Stream.findNth()?Как закодировать Stream.findNth()?

Я практикую Java 8, переписывая некоторые устаревшие коды. И мне интересно, как можно использовать нижеследующую функцию с помощью Stream API.

static curPipeNumber = 0; 

/** skipToEntry() updates 'curPipeNumber' to 'pipeNumber' and returns the first byte position of the word before the ('pipeNumber')-th pipe. 
* It does so by reading and ignoring unnecessary bytes from the buffer. 
* e.g., 
*/ 
static int skipToEntry(byte[] buf, int len, int nextByteToBeRead, int pipeNumber) { 

    if(curPipeNumber == pipeNumber) 
     return nextByteToBeRead; 

    for(; nextByteToBeRead < len; nextByteToBeRead++) { 
     if(buf[nextByteToBeRead] == '|') { 
      ++curPipeNumber; 
      if(curPipeNumber == pipeNumber) { 
       return ++nextByteToBeRead;    
      } 
     } 
    } 

    return nextByteToBeRead; 
} 

Я надеюсь, что это перевело бы на что-то вроде:

static int skipToEntry(byte[] buf, int len, int nextByteToBeRead, int pipeNumber) {  
    if(curPipeNumber == pipeNumber) 
     return nextByteToBeRead; 

    OptionalInt pipeIndex = IntStream.range(i, len) 
      .filter(n -> buf[n] == '|') 
       .findNth(pipeNumber); 

      curPipeNumber = pipeNumber; 
      nextByteToBeRead = pipeIndex.getAsInt() + 1; 

    return nextByteToBeRead; 
} 

ответ

7
OptionalInt result = stream.skip(n-1).findFirst(); 
Смежные вопросы