不兼容的类型:lambda表达式中的错误返回类型?

时间:2015-02-22 09:07:52

标签: java eclipse lambda java-8

给出以下代码:

/**
 * Prints the grid with hint numbers.
 */
private void printGridHints() {
  minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> square.isMineLocatedHere() ? System.out.print("*") : System.out.print(square
            .getNumSurroundingMines()));
    System.out.println();
  });
}

我的编译器给出了以下错误:

error: incompatible types: bad return type in lambda expression

square -> square.isMineLocatedHere() ? System.out.print("*") : System.out.print(square
                                                                                ^

missing return value

我正在运行Gradle 2.2版,我安装了JDK 8u31。有趣的是,Eclipse没有显示任何编译器错误,即使在我清理并重建我的项目之后,但是当我在命令行上运行gradle build时,我得到了这个编译器错误。

为什么我会收到此错误,我该如何解决?

1 个答案:

答案 0 :(得分:12)

您不能将void作为三元表达式中第二个和第三个表达式的类型。即,你不能

.... ? System.out.print(...) : System.out.print(...)
                  ^^^^^                   ^^^^^

(如果Eclipse另有说法,那就是一个错误。)请改用if语句:

minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> {
            if (square.isMineLocatedHere())
                System.out.println("*");
            else
                System.out.println(square.getNumSurroundingMines());
        })
  });

或按如下方式细分:

minesweeperGrid.forEach((k, v) -> {
    v.stream().forEach(
        square -> {
            System.out.println(square.isMineLocatedHere()
                    ? "*" : square.getNumSurroundingMines())
        })
  });