为什么这个java 8代码不会编译?

时间:2015-01-28 05:32:35

标签: eclipse lambda java-8

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

我正在使用Eclipse。 eclipse给出了以下错误。

Type mismatch: cannot convert from Stream<Object> to Stream<ProcessArray.Cell>

3 个答案:

答案 0 :(得分:2)

@ flo的替代解决方案

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)));
}

答案 1 :(得分:1)

@ flo的答案,改为使用flatMap(flatMap“嵌入”由flatMapping函数返回的Stream到原始流中):

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
;

答案 2 :(得分:0)

您的代码映射到Streams流。将其分为声明和返回提供以下代码:

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

您需要将Streams缩减为单个Stream:

// 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);        

编辑正如Holger在评论中指出的那样,使用Stream.concat()减少Streams流并不是非常高效。使用flatMap方法而不是reduce使用其他解决方案之一。