2015-01-28 2 views

ответ

2

Альтернативное решение для @ Фло

public static Stream<Cell> streamCells(int rows, int cols) { 
    return IntStream.range(0, rows).boxed() 
      .flatMap(row -> IntStream.range(0, cols).mapToObj(col -> new Cell(row, col))); 
} 
0

Ваш код соответствует потоку потоков. Разделяющая ее в декларацию и возврат обеспечивает следующий код:

Stream<Stream<Cell>> mapToObj = IntStream.range(0, rows).mapToObj(row -> IntStream.range(0, cols).mapToObj(col -> new Cell(row, col))); 
return mapToObj; 

Вы должны сократить свои потоки в один поток:

// CAVE: poor performance 
return IntStream.range(0, rows) 
    .mapToObj(row -> IntStream.range(0, cols).mapToObj(col -> new Cell(row, col))) 
    .reduce(Stream.empty(), Stream::concat);   

Edit: Как отметил Holger в комментариях, уменьшая Stream Streams с Stream.concat() не очень эффективен. Используйте одно из других решений, используя метод flatMap вместо reduce.

+0

Ваш код дает мне «Тип несоответствия: невозможно преобразовать из Stream в Stream '. –

+0

Извините, ваш ответ был прав. Ошибка произошла из-за ошибки Eclipse. Отметьте свой ответ как правильный. –

+1

Не делайте этого. Использование 'Stream.concat' для большего количества потоков будет ошибкой производительности. Это подразумевает, что все подпотоки создаются с нетерпением до того, как результирующий поток будет возвращен, и на них будет ссылаться «конкатенационный поток» в течение его жизненного цикла. Используйте 'Stream.flatMap', который предназначен для этого использования. Он не будет создавать экземпляр какого-либо подпотока до того, как это потребует фактическая операция терминала. Он также позволяет субпотокам получать сбор мусора сразу после использования. – Holger

1

@ ответ Фло, переработан использовать flatMap вместо (flatMap "встраивает" поток, возвращаемый функцией flatMapping в исходном потоке):

return IntStream.range(0, rows) 
    .mapToObj(row -> IntStream.range(0, cols) 
    .mapToObj(col -> new Cell(row, col)) 
) // int -> Stream<Cell> 
    .flatmap(Function.identity()) // Stream<Cell> -> Cell 
; 
Смежные вопросы